参考我之前的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仍然有权访问图像?
答案 0 :(得分:3)
根据documentation for FileProvider,Context.grantUriPermission()
:
在您通过调用撤消权限之前,权限仍然有效 revokeUriPermission()或直到设备重新启动。
但是,如果您使用Intent标志:
在Intent中授予的权限在堆栈中保持有效 接收活动处于活动状态。当堆栈完成时, 权限会自动删除。
所以看起来这是预期的行为(如果您使用相同的图像/相同的Uri进行测试)。