android - 通过意图共享图像 - uri权限

时间:2014-06-15 18:05:51

标签: android android-intent

参考我之前的question

我想问一些特定于每个URI权限的内容。我理解,要发送二进制数据,例如其URI由应用程序中的提供者持有的图像,必须做两件事:

1)提供者应该设置android:grantUriPermission

2)必须通过Intent.setFlags或context.grantUriPermission

授予Uri权限

当我不做第2步时,我希望看到效果。我的提供者是:

  <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.android.provider.DataSharing"
        android:exported="false"
        android:grantUriPermissions="true">

        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/paths"/>

   </provider> 

与App2共享图像的App1执行以下操作:

 File imagePath = new File(getApplicationContext().getFilesDir(), "images");
 File newFile = new File(imagePath, "earth.jpg");
 Uri contentUri = FileProvider.getUriForFile(getApplicationContext(),
                        "com.android.provider.DataSharing", newFile);
 Intent i = new Intent();
 i.setAction(Intent.ACTION_SEND);
 i.putExtra(Intent.EXTRA_STREAM, contentUri);
 i.setType("image/jpeg");
 startActivity(i);

我的接收应用(App2)确实:

 Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
 if (imageUri != null){
        ImageView iv = (ImageView) findViewById(R.id.imageView);
        iv.setImageURI(imageUri);
 }

但不知何故,即使没有通过意图或上下文授予URI权限,我也可以在App2的图像视图中看到图像。我在Android 4.4中测试。

有人可以帮我解释一下这种行为吗?我做了什么,App2仍然有权访问图像?

1 个答案:

答案 0 :(得分:3)

根据documentation for FileProviderContext.grantUriPermission()

  

在您通过调用撤消权限之前,权限仍然有效   revokeUriPermission()或直到设备重新启动。

但是,如果您使用Intent标志:

  

在Intent中授予的权限在堆栈中保持有效   接收活动处于活动状态。当堆栈完成时,   权限会自动删除。

所以看起来这是预期的行为(如果您使用相同的图像/相同的Uri进行测试)。