Android 引用drawable中的文件以创建Uri

Android 引用drawable中的文件以创建Uri,android,android-file,Android,Android File,我想将图像res/drawable hdpi/nasa_image.jpg设置为壁纸 我编写了以下代码,但它引发了FileNotFoundException Uri u1 = Uri.fromFile(new File("res/drawable-hdpi/nasa_image.jpg")); Uri u2 = Uri.parse("android.resource://com.my.package/drawable/nasa_image.jpg"); Uri u3 = Uri.parse("a

我想将图像
res/drawable hdpi/nasa_image.jpg
设置为壁纸

我编写了以下代码,但它引发了
FileNotFoundException

Uri u1 = Uri.fromFile(new File("res/drawable-hdpi/nasa_image.jpg"));
Uri u2 = Uri.parse("android.resource://com.my.package/drawable/nasa_image.jpg");
Uri u3 = Uri.parse("android.resource://com.my.package/" + R.drawable.nasa_image);
WallpaperManager w = WallpaperManager.getInstance(this);

Bitmap bitmap;
try {
    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(u));
    w.setBitmap(bitmap);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
首先,我尝试了
u1
。它不起作用。然后我找了找。然后我尝试了
u2
u3

我检查了日志。每次它都给出相同的
FileNotFoundException

Uri u1 = Uri.fromFile(new File("res/drawable-hdpi/nasa_image.jpg"));
Uri u2 = Uri.parse("android.resource://com.my.package/drawable/nasa_image.jpg");
Uri u3 = Uri.parse("android.resource://com.my.package/" + R.drawable.nasa_image);
WallpaperManager w = WallpaperManager.getInstance(this);

Bitmap bitmap;
try {
    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(u));
    w.setBitmap(bitmap);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

如何参考它?我错在哪里?我选错根目录了吗?

我认为在android中这样做是错误的。为什么不使用资源标识符

ImageView imgView=(ImageView)findViewById(R.id.imageView1);
int id = getResources().getIdentifier(nasa_image, "drawable", getPackageName());
Drawable drawable=res.getDrawable(id);
imgView.setImageDrawable(drawable);

更新以从可绘制转换为位图只需使用此选项(假设您的可绘制是Bitmapdrawable的
实例)

如果不确定可绘制实例,请使用此方法

public static Bitmap drawableToBitmap (Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}
如果您确定选择了正确的文件路径,请使用此方法

 private Drawable getDrawable(String path) {
      File imgFile = new File(path);
      if (imgFile.exists()) {
         Bitmap bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
         return new BitmapDrawable(resources, bitmap);
      }
      return null;
   }
您可以根据您的问题将其调整为返回位图或可绘制

Uri u1 = Uri.parse("R.drawable.nasa_image");

不应包括扩展名(.jpg) 使用:


Uri.parse(“android.resource://“+BuildConfig.APPLICATION_ID+”/drawable/nasa_image”)

为什么不能直接使用
w.setResource(R.drawable.nasa_image)
?我后来看到了这个方法并尝试了它。但它也给出了非法状态异常:无法执行活动的方法。你能告诉我哪里可能有问题吗?所有这些代码都在点击按钮上。你能发布堆栈跟踪吗?谢谢你的建议。我需要授予权限。这很好,但我需要
Bitmap
对象来使用
w.setBitmap
方法。@Shashwat simple只需使用此位图=((BitmapDrawable)d).getBitmap();要从drawable转换为bitmapI,我刚刚找到了一种方法来设置壁纸
w.setResource(R.drawable.nasa_image)
。但还是要谢谢你的建议。有什么方法可以使用文件名引用文件吗?我没有找到任何方法
res.getDrawable
。要将资源id转换为
Drawable
,我们可以执行`Drawable d=getResources().getDrawable(android.R.Drawable.ic_dialog_email)`。你可以把你的答案说清楚。我知道绝对路径,你也可以从文件中得到位图或绘图。看看我的更新@shashwat,这不起作用<代码>R.drawable.nasa_图像
应不带引号。
Uri u1 = Uri.parse("R.drawable.nasa_image");