2012-03-16 19 views
6

Estoy intentando cargar una imagen desde el recurso en mi aplicación de Android, pero sigo obteniendo el error "IllegalArgumentException: Expected file scheme in URI".Android: obtención de un recurso de imagen en Uri: IllegalArgumentException

Puse mi archivo 'missing_album_art.png' en las carpetas dibujables-hdpi, drawable-ldpi y drawable-mdpi de mi proyecto y actualicé Eclipse para que se muestren allí.

La línea que estoy usando para crear la URI es:

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

El 'android.aberplayer' es el paquete principal de mi solicitud y también la que contiene la clase en la que yo uso la línea anterior .

El error me siguen dando es:

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) 

¿Hay algo que no entiendo de acceder a los recursos de imagen en aplicaciones de Android?

Respuesta

-3

probar este lugar

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

Esto se traduce en "IllegalArgumentException: URI no es absolute: R.drawable.missing_album_art "cuando intento convertir Uri en File con esto: ' currentAlbumArt = new File (new URI (uri.toString())); ' – JakeP

3

Los recursos todos nos asignan a números enteros. Desea obtener el valor entero de R.drawable.missing_album_art, luego anexarlo al resto de la cadena de ruta. es decir,

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

... es decir, si realmente necesita el Uri. Normalmente, sólo puede utilizar un recurso de imagen como esta:

view.setImageResource(R.drawable.missing_album_art); 

Si desea leer un recurso en un archivo, la siguiente es una manera de hacerlo (esto escribe un archivo en el directorio de la aplicación (es decir/datos/datos/nombrepaquete) con el "nombre de archivo" nombre):

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

Cambié el código para agregar el R. drawable.missing _album_art a la cadena pero el problema persiste, solo que ahora la línea de error es 'java.lang.IllegalArgumentException: Esquema de archivo esperado en URI: android.resource: // src.android.aberplayer/2130837505' – JakeP

+0

¿Es posible que exista? un problema porque estoy tratando de usar el Uri mencionado anteriormente.analizar la línea en una clase diferente a una actividad? Cuando lo usé en la actividad que se supone que debe mostrar la imagen, funcionó. Sin embargo, cuando trato de usarlo en una clase diferente, que no amplía ni implementa ninguna clase de Android, se produce un error. ¿Puede explicarme esto por favor? (¿Necesita ver algún código?) – JakeP

+0

@KurakDarcia hmm. Para ser sincero, no estoy seguro. Siento que el error no proviene de esa línea 'Uri.parse'. Tal vez publicar un poco más de contexto/líneas de código. ¿Por qué estás usando un Uri/cómo lo estás usando? –

8

Si usted puede poner el archivo de imagen en assets carpeta, el código siguiente se puede utilizar para obtener el Uri -

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

Tenga en cuenta que Uri.parse se utiliza para obtener Uri desde una cadena Url directamente desde un recurso. Hay otra solución más limpia, pero no pude recordarlos. Actualizaré la publicación cuando los encuentre.

Editar: La cadena de ruta Uri debe estar en el siguiente formato si desea utilizar el recurso directamente: -

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

Comprobar this post.

+0

Solo un recordatorio de que la constante en el marco es: 'ContentResolver.SCHEME_ANDROID_RESOURCE' – Simon

Cuestiones relacionadas