我试图通过文件提供程序授予临时读取权限,从我的应用程序的缓存目录向另一个外部应用程序发送位图。当我在手机上选择消息传递应用程序(包名:" com.android.mms")时,消息传递应用程序崩溃,我收到错误:
java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.example.brandon.emojimms2/shared_images/image.png from pid=9804, uid=10024 requires the provider be exported, or grantUriPermission()
我从意图选择器中选择com.android.mms时只会出现此错误。我选择的每个其他应用程序都会发送位图而不会出错。即使是较新手机上的消息系统(com.google.android.apps.messaging)也可以使用fileprovider发送位图而不会出现任何错误。我用几个模拟的手机和应用程序检查了这一点,结果总是一样。我发现唯一一个与文件提供程序有问题的应用程序是" com.android.mms"。
以下是我分享意图的代码:
private void shareImage()
{
File imagePath = new File(mContext.getCacheDir(), "images");
File newFile = new File(imagePath, "image.png");
Uri contentUri = FileProvider.getUriForFile(mContext, "com.example.brandon.emojimms2", newFile);
if (contentUri != null) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
shareIntent.setDataAndType(contentUri, mContext.getContentResolver().getType(contentUri));
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
startActivity(Intent.createChooser(shareIntent, "Choose an app"));
}
}
我甚至尝试过在另一个stackoverflow帖子中推荐的解决方案,该帖子建议授予每个单独的意图活动写入和读取uri权限,但这也不起作用。