1

我想将图像设置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. 它没有用。然后我搜索并找到了这个。然后我尝试了u2u3

我检查了日志。每次都给一样的FileNotFoundException

如何参考它?我哪里错了?我是否使用了错误的根目录?

4

3 回答 3

0

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

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

或者

ImageView imgView=(ImageView)findViewById(R.id.imageView1);
Drawable drawable= getResources().getDrawable(R.drawable.nasa_image);
imgView.setImageDrawable(drawable);
imgView.setImageDrawable();

更新从drawable转换为位图只需使用它(假设你的drawable是一个instanceof Bitmapdrawable

Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

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

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;
   }

您可以根据您的问题调整它以返回位图或可绘制

于 2013-03-09T12:53:35.317 回答
0

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

Uri.parse("android.resource://" + BuildConfig.APPLICATION_ID + "/drawable/nasa_image");

于 2017-07-18T15:10:18.750 回答
-1

尝试

Uri u1 = Uri.parse("R.drawable.nasa_image");
于 2013-03-09T12:55:25.383 回答