1

我在与文件提供者和 Intent.EXTRA_TEXT共享视频.mp4文件时拒绝了权限。

如果我删除该行:

shareIntent.putExtra(Intent.EXTRA_TEXT, "#myappHashtag");

一切正常。但我需要视频文件+额外的文本。

我认为问题是:共享uri中的caption=%23myappHashtag,但我该如何解决?

太感谢了。

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>
4

1 回答 1

4

您错过了addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)您的Intent. 如果您是 21 岁或更高,这将起作用,以便向任何处理请求的应用程序minSdkVersion授予权限。UriACTION_SEND

如果您的minSdkVersion年龄低于 21 岁,您将不得不ACTION_SEND为您的Intent. 在那些较旧的设备上,addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)仅授予您在(例如,)Uri的“数据”方面拥有的权限,而不是附加项中的值。Intentnew 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);
    }
  }

(你把额外iIntent和放在outputUri哪里)Uri

另外,提醒一下:ACTION_SEND实现没有义务同时支持EXTRA_TEXTEXTRA_STREAM

于 2016-08-29T19:46:16.577 回答