我试图将位图从应用程序的缓存目录发送到短信应用程序。我正在使用文件提供程序向处理此意图的应用程序授予临时权限。当我尝试发送意图并从意图选择器中选择默认的android短信应用程序时,我的消息应用程序崩溃,并且出现此错误。我尝试从意图选择器中选择其他应用程序,例如电子邮件和其他消息传递应用程序,但它似乎运行正常,仅在默认的文本消息传递应用程序崩溃。
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()
这是我分享意图的代码
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"));
}
}
我可以肯定我已经正确设置了文件提供程序,但是这里是清单,以备不时之需。
编辑:我只是做了一些测试,似乎短信应用程序的崩溃是在较早的api上的手机上发生的,但是正在使用7.1之类的新api。短信应用程序或您应该授予uri读取权限的方式是否发生了变化?
最佳答案
尝试这个:
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}