我在与文件提供程序和Intent.EXTRA_TEXT共享视频 .mp4 文件时有权限拒绝。
如果我删除该行:
shareIntent.putExtra(Intent.EXTRA_TEXT, "#myappHashtag");
一切正常。但我需要视频文件+额外文字。
我认为问题是:caption =%23myappHashtag在分享uri但我该如何解决?
非常感谢你。
private void ShareItem(File fileToShare) {
String package_name = "com.lucagrillo.myapp";
Uri uri = FileProvider.getUriForFile(this, package_name + ".fileprovider", fileToShare);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.putExtra(Intent.EXTRA_TEXT, "#myappHashtag");
shareIntent.setType(intentFormatType);
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_with)));
}
例外:
Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.lucagrillo.myapp.fileprovider/images/shareFile.mp4?caption=%23myappHashtag from pid=9630, uid=10093 requires the provider be exported, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:608)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:483)
at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:474)
at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:419)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:313)
at android.os.Binder.execTransact(Binder.java:565)
清单文件提供程序:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.lucagrillo.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
答案 0 :(得分:4)
您错过了addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
上Intent
的来电。如果您的minSdkVersion
为21或更高,那么这将有效,以便将Uri
的权利授予处理ACTION_SEND
请求的任何应用。
如果您的minSdkVersion
低于21,则您必须为ACTION_SEND
的所有Intent
处理程序授予权限。在这些较旧的设备上,addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
仅授予{&#34;数据&#34;}中Uri
所允许的权限。 Intent
的一个方面(例如,new Intent(Intent.ACTION_VIEW, uri)
),而不是额外的Uri
值。
你看起来有点像这样的代码:
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
else {
List<ResolveInfo> resInfoList=
getPackageManager()
.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, outputUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
(其中i
是Intent
而outputUri
是Uri
你加入的额外费用
另外,提醒一下:ACTION_SEND
实施没有义务同时支持EXTRA_TEXT
和EXTRA_STREAM
。