如何正确地将Uri从本地文件放入Intent

时间:2017-06-07 15:34:59

标签: android android-intent uri drawable

我想将我的本地图像文件(位于res / drawable)转换为Uri,因此我可以将其放入Intent中以启动Activity。

这是我到目前为止所得到的:

    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.setType("image/*");

    Uri uri = Uri.fromFile(new File("/res/drawable/photo.jpg"));
    sendIntent.putExtra(Intent.EXTRA_STREAM, uri);

    startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.share)));

然后,接收此意图的活动会在ImageView中显示图像。像这样:

    Uri imageUri = (Uri) getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
    ImageView myImage = (ImageView) findViewById(R.id.imageView_receive);
    myImage.setImageBitmap(bitmap); 

但不是显示图像,而是抛出 java.io.FileNotFoundException

java.io.FileNotFoundException: No resource found for: android.resource://com.my.package/drawable/photo.jpg

我搜索并尝试了其他方法来通过我的文件获取Uri:

    Uri uri = Uri.parse("file:///res/drawable/photo.jpg");
    Uri uri = Uri.parse("android.resource://com.my.package/drawable/photo.jpg"); 

但他们都为我回复了同样的错误。

为什么我的图像无法识别?

2 个答案:

答案 0 :(得分:1)

您应该为您的应用程序创建ContentProvider,这样您就可以共享资源。

试试这个lib,它很棒。 https://github.com/commonsguy/cwac-provider

答案 1 :(得分:1)

  

我想将我的本地图像文件(位于res / drawable)转换为Uri,因此我可以将其放入Intent中以启动Activity。

资源是开发人员计算机上的文件。它们不是设备上的文件。

  

这是我到现在为止所得到的

那是行不通的,因为AFAIK的文件系统根目录中没有/res目录的Android设备,而且你的可绘制资源也不会存在。

  

为什么我的图像无法识别?

您的第三个(android.resource计划)是最接近的。摆脱.jpg扩展名。

但是,许多第三方应用程序无法识别该方案。而且,如果您要实现处理此请求的活动,我不知道您使用ACTION_SEND的原因。如果您的目标是仅在您自己的应用中工作,请跳过Uri,将可绘制资源ID(R.drawable.photo)打包为int个额外内容,并让您的其他活动使用该资源ID更自然地(例如,setImageResource()上的ImageView