Android - 将图像资源转换为Uri:IllegalArgumentException

时间:2012-03-16 00:30:04

标签: android image resources uri drawable

我正在尝试从我的Android应用中的资源加载图片,但我不断收到“IllegalArgumentException:URI中的预期文件方案”错误。

我将'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 个答案:

答案 0 :(得分:9)

如果您可以将图片文件放入assets文件夹,则可以使用以下代码获取Uri -

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

请注意,Uri.parse用于从字符串Uri获取Url而不是直接从资源获取。还有其他更清洁的解决方案,但我无法回想起它们。我发现它们时会更新帖子。

修改 如果要直接使用资源,String Uri路径应采用以下格式: -

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

检查this post.

答案 1 :(得分: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);

如果要将资源读入文件,以下是一种方法(将文件写入应用程序目录(即/ data / data / packagename),名称为“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;
}

答案 2 :(得分:-3)

试试这个

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