Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - getting an image resource into Uri: IllegalArgumentException

I'm trying to load an image from the resource in my Android app but I keep getting the "IllegalArgumentException: Expected file scheme in URI" error.

I put my 'missing_album_art.png' file in drawable-hdpi, drawable-ldpi and drawable-mdpi folders in my project and refreshed Eclipse so that it displays they're there.

The line I'm using to create the Uri is:

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

The 'android.aberplayer' is the main package of my application and also the one containing the class in which I use the above line.

The error I keep getting is:

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)

Is there something I don't understand about accessing the image resources in Android applications?

like image 369
JakeP Avatar asked Mar 16 '12 00:03

JakeP


2 Answers

If you can put the image file into assets folder, the code below can be used to get the Uri -

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

Note that Uri.parse is used for getting Uri from a string Url not from a resource directly. There are other cleaner solution, but I couldn't recall them. I'll update the post when I found them.

Edit: The String Uri path should be in the following format if you want to use the resource directly:-

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

Check this post.

like image 157
noob Avatar answered Oct 16 '22 22:10

noob


The resources all get mapped to integers. You want to get the integer value of R.drawable.missing_album_art, then append that to the rest of your path string. i.e.,

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

…that is, if you really do need the Uri. Normally, you can just use an image resource like this:

view.setImageResource(R.drawable.missing_album_art);

If you want to read a resource into a file, the following is one way to do it (this writes a file to the application directory (i.e. /data/data/packagename) with the name "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;
}
like image 25
Jonathan Fretheim Avatar answered Oct 16 '22 23:10

Jonathan Fretheim