2012-03-16 1 views
6

Sto tentando di caricare un'immagine dalla risorsa nella mia app per Android ma continuo a ricevere l'errore "IllegalArgumentException: Expected file scheme in URI".Android: acquisizione di una risorsa immagine in Uri: IllegalArgumentException

Ho inserito il mio file "missing_album_art.png" nelle cartelle drawable-hdpi, drawable-ldpi e drawable-mdpi nel mio progetto e ho aggiornato Eclipse in modo che mostri che ci sono.

La linea che sto usando per creare l'URI è:

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

Il 'android.aberplayer' è il pacchetto principale della mia applicazione e anche quello che contiene la classe in cui io uso la linea di cui sopra .

L'errore continuo a ricevere è:

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'è qualcosa che non capisco su come accedere alle risorse di immagine in applicazioni Android?

risposta

-3

Prova a modificare la

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

Questo si traduce in "IllegalArgumentException: URI non è absolute: R.drawable.missing_album_art "quando provo a convertire l'Uri in File con questo: ' currentAlbumArt = new File (nuovo URI (uri.toString())); ' – JakeP

3

Le risorse tutti mappati a numeri interi. Si desidera ottenere il valore intero di R.drawable.missing_album_art, quindi aggiungerlo al resto della stringa del percorso. Ad esempio,

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

... che è, se davvero hai bisogno di Uri. Normalmente, si può semplicemente utilizzare una risorsa immagine come questa:

view.setImageResource(R.drawable.missing_album_art); 

Se volete leggere una risorsa in un file, il seguente è un modo per farlo (questo scrive un file nella directory dell'applicazione (ad esempio/dati/dati/pacchetto), con il nome di "nome del file"):

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

Ho cambiato il codice per aggiungere la R. drawable.missing _album_art alla stringa ma il problema persiste, solo ora la riga di errore è 'java.lang.IllegalArgumentException: schema file previsto in URI: android.resource: // src.android.aberplayer/2130837505' – JakeP

+0

E 'possibile che ci sia un problema perché sto cercando di usare l'Uri sopra menzionato.analizzare la linea in una classe diversa da un'attività? Quando l'ho usato nell'attività che dovrebbe visualizzare l'immagine, ha funzionato. Tuttavia, quando provo a utilizzarlo in una classe diversa, che non estende o implementa alcuna classe Android, si verifica un errore. Puoi spiegarmi questo per favore? (Hai bisogno di vedere alcun codice?) – JakeP

+0

@KurakDarcia hmm. Ad essere onesti non ne sono sicuro. Mi sembra che l'errore non provenga da quella riga 'Uri.parse'. Magari postare un po 'più di contesto/linee di codice. Perché stai usando un Uri/come lo stai usando? –

8

Se si può mettere il file immagine nella cartella assets, il codice qui sotto può essere utilizzato per ottenere il Uri -

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

Si noti che Uri.parse viene utilizzato per ottenereda una stringa Url non direttamente da una risorsa. Ci sono altre soluzioni più pulite, ma non posso ricordarle. Aggiornerò il post quando li ho trovati.

Edit: la stringa di percorso Uri dovrebbe essere il seguente formato se si desidera utilizzare la risorsa direttamente: -

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

check this post.

+0

Solo un promemoria che la costante nel framework è: 'ContentResolver.SCHEME_ANDROID_RESOURCE' – Simon