2012-03-16 4 views
6

Я пытаюсь загрузить изображение с ресурса в своем приложении для Android, но я продолжаю получать ошибку «Ошибка IllegalArgumentException: ожидаемый файл в URI».Android - получение ресурса изображения в Uri: IllegalArgumentException

Я поместил свой файл «missing_album_art.png» в файлы drawable-hdpi, drawable-ldpi и drawable-mdpi в свой проект и обновил Eclipse, чтобы он показывал, что они есть.

Линии Я использую для создания Uri является:

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

«android.aberplayer» является основным пакетом моего приложения, а также один, содержащий класс, в котором я использую выше линии ,

Ошибки я получаю это:

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) 

Есть ли что-то я не понимаю, о доступе к ресурсам изображений в Android приложений?

ответ

-3

Попробуйте вместо

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

Это приводит к «IllegalArgumentException: URI не absolute: R.drawable.missing_album_art ", когда я пытаюсь преобразовать Uri в файл с этим: ' currentAlbumArt = new File (новый URI (uri.toString())); ' – JakeP

3

ресурсы все получить преобразуются в целые числа. Вы хотите получить целочисленное значение R.drawable.missing_album_art, а затем добавить это к остальной строке вашего пути. т.е.

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

... то есть, если вам действительно нужен Uri. Как правило, вы можете просто использовать ресурс изображения, как это:

view.setImageResource(R.drawable.missing_album_art); 

Если вы хотите прочитать ресурс в файл, следующие один из способов сделать это (это записывает файл в папку приложения (т.е./данные/данные/имя_пакета) с именем «имя файла»):

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

Я изменил код, чтобы добавить R. drawable.missing _album_art, но проблема остается, только теперь строка ошибки 'java.lang.IllegalArgumentException: ожидаемая схема файла в URI: android.resource: // src.android.aberplayer/2130837505' – JakeP

+0

Возможно ли, что есть проблема, потому что я пытаюсь использовать вышеупомянутый Uri.Линия разбора в другом классе, чем действие? Когда я использовал его в Activity, который должен отображать изображение, он работал. Однако, когда я пытаюсь использовать его в другом классе, который не расширяет или не реализует никаких классов Android, это приводит к ошибке. Можете ли вы объяснить это мне, пожалуйста? (Вам нужно увидеть какой-нибудь код?) – JakeP

+0

@ KurakDarcia hmm. Честно говоря, я не уверен. Я чувствую, что ошибка не исходит из этой строки 'Uri.parse'. Возможно, опубликуйте еще несколько контекстов/строк кода. Почему вы используете Uri/как вы его используете? –

8

Если вы можете поместить файл изображения в assets папку, приведенный ниже код может быть использован для получения Uri -

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

Обратите внимание, что Uri.parse используется для получения Uri из строки Url не из ресурса напрямую. Есть другое чистое решение, но я не мог вспомнить их. Я обновлю сообщение, когда найду их.

Edit: Строка Uri путь должен быть в следующем формате, если вы хотите использовать ресурс напрямую: -

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

Проверить this post.

+0

Напомним, что константа в структуре: 'ContentResolver.SCHEME_ANDROID_RESOURCE' – Simon

Смежные вопросы