【发布时间】:2014-06-15 18:05:51
【问题描述】:
参考我之前的question。
我想问一些特定于每个 URI 权限的问题。我知道要发送二进制数据(如图像,其 URI 由您的应用程序中的提供者持有),必须做两件事:
1) Provider 应设置 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>
App1 与 App2 共享图像执行以下操作:
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 仍然有权访问图像?
【问题讨论】:
-
您确定这不是您之前授予权限的
Uri? -
@CommonsWare 我跑了 2 个测试。首先,我授予了权限。然后我注释了授予权限的代码行,并在 genymotion 中再次从 Android Studio 运行应用程序。 App2 是否保留之前授予的权限?
-
当你授予权限时,是
Context.grantUriPermission(),还是Intent标志? -
@CommonsWare 我使用了上下文的 API。
-
@CommonsWare 我明白为什么。