2012-03-16 34 views
6

Tôi đang cố gắng tải hình ảnh từ tài nguyên trong ứng dụng Android của mình nhưng tôi vẫn gặp lỗi "IllegalArgumentException: Expected scheme in URI".Android - nhận tài nguyên hình ảnh vào Uri: IllegalArgumentException

Tôi đặt tệp 'missing_album_art.png' vào thư mục drawable-hdpi, drawable-ldpi và drawable-mdpi trong dự án của tôi và làm mới Eclipse để nó hiển thị chúng ở đó.

Dòng Tôi đang sử dụng để tạo ra các Uri là:

Uri uri = Uri.parse("android.resource://android.aberplayer/R.drawable.missing_album_art"); 

Các 'android.aberplayer' là gói chính của ứng dụng của tôi và cũng là một trong có chứa các lớp mà tôi sử dụng dòng trên .

Các lỗi tôi tiếp tục nhận được là:

03-16 00:16:29.252: E/AndroidRuntime(25598): FATAL EXCEPTION: main 
03-16 00:16:29.252: E/AndroidRuntime(25598): java.lang.IllegalArgumentException: Expected file scheme in URI: android.resource://src.android.aberplayer/R.drawable.missing_album_art 
03-16 00:16:29.252: E/AndroidRuntime(25598): at java.io.File.checkURI(File.java:245) 
03-16 00:16:29.252: E/AndroidRuntime(25598): at java.io.File.<init>(File.java:182) 
03-16 00:16:29.252: E/AndroidRuntime(25598): at android.aberplayer.CurrentSongList.getCurrentAlbumArt(CurrentSongList.java:69) 

Có cái gì tôi không hiểu về việc truy cập các nguồn tài nguyên hình ảnh trong các ứng dụng Android?

Trả lời

-3

Hãy thử điều này thay vì

Uri uri = Uri.parse("R.drawable.missing_album_art"); 
+0

Điều này dẫn đến "IllegalArgumentException: URI không phải là tuyệt đối: R.drawable.missing_album_art "khi tôi cố chuyển đổi Uri thành Tệp với điều này: ' currentAlbumArt = new Tệp (new URI (uri.toString())); ' – JakeP

3

Các nguồn lực tất cả được ánh xạ tới các số nguyên. Bạn muốn lấy giá trị số nguyên của R.drawable.missing_album_art, sau đó nối thêm vào phần còn lại của chuỗi đường dẫn của bạn. tức là,

Uri uri = Uri.parse("android.resource://android.aberplayer/" + R.drawable.missing_album_art); 

… tức là, nếu bạn thực sự cần Uri. Thông thường, bạn chỉ có thể sử dụng một nguồn tài nguyên hình ảnh như thế này:

view.setImageResource(R.drawable.missing_album_art); 

Nếu bạn muốn đọc một tài nguyên vào một tập tin, sau đây là một cách để làm điều đó (điều này đã viết một tập tin vào thư mục ứng dụng (ví dụ:/dữ liệu/dữ liệu/tên gói) với cái tên "filename"):

private File resToFile(int resourceID, String filename) { 
    File file = getApplicationContext().getFileStreamPath(filename); 
    if(file.exists()) { 
     return file; 
    } 

    InputStream is; 
    FileOutputStream fos; 
    try { 
     is = getResources().openRawResource(resourceID); 
     byte[] buffer = new byte[is.available()]; 
     is.read(buffer); 
     fos = openFileOutput(filename, MODE_PRIVATE); 
     fos.write(buffer); 
     fos.close(); 
     is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return file; 
} 
+0

Tôi đã thay đổi mã để nối R. drawable.missing _album_art cho chuỗi nhưng vấn đề vẫn tồn tại, chỉ bây giờ dòng lỗi là 'java.lang.IllegalArgumentException: Sơ đồ tệp dự kiến ​​trong URI: android.resource: // src.android.aberplayer/2130837505' – JakeP

+0

Có thể có một vấn đề bởi vì tôi đang cố gắng sử dụng Uri nói trên.phân tích cú pháp trong một lớp khác với một hoạt động? Khi tôi sử dụng nó trong Hoạt động được cho là để hiển thị hình ảnh, nó hoạt động. Tuy nhiên, khi tôi cố gắng sử dụng nó trong một lớp khác, mà không mở rộng hoặc thực hiện bất kỳ lớp học Android, nó dẫn đến một lỗi. Bạn có thể giải thích điều này cho tôi không? (Bạn có cần xem mã nào không?) – JakeP

+0

@KurakDarcia hmm. Thành thật mà nói tôi không chắc chắn. Tôi cảm thấy lỗi không đến từ dòng 'Uri.parse' đó. Có thể đăng thêm một số ngữ cảnh/dòng mã. Tại sao bạn sử dụng một Uri/làm thế nào bạn đang sử dụng nó? –

8

Nếu bạn có thể đặt các tập tin hình ảnh vào assets thư mục, mã dưới đây có thể được sử dụng để có được những Uri -

Uri uri=Uri.parse("file:///android_asset/images/missing_album_art.png"); 

Lưu ý rằng Uri.parse được sử dụng để nhận Uri từ một chuỗi Url không phải từ tài nguyên trực tiếp. Có những giải pháp sạch hơn, nhưng tôi không thể nhớ chúng. Tôi sẽ cập nhật bài đăng khi tôi tìm thấy chúng.

Edit: Các Chuỗi Uri con đường phải ở trong các định dạng sau đây nếu bạn muốn sử dụng các tài nguyên trực tiếp: -

"android.resource://[package]/[res type]/[res name]" 

Kiểm tra this post.

+0

Chỉ cần nhắc nhở rằng hằng số trong khung là: 'ContentResolver.SCHEME_ANDROID_RESOURCE' – Simon

Các vấn đề liên quan