与其他应用共享数据时Android M的权限

kan*_*idj 5 android android-sharing android-6.0-marshmallow

似乎只有在其他应用程序手动询问READ_EXTERNAL_STORAGE权限时才能将数据共享到Android M上的其他应用程序,我想知道是否有人知道解决此问题的方法,而无需手动打开我可以共享的所有应用程序并选择存储权限.

例如,我有以下Intent来共享一些数据:

  Intent shareIntent = new Intent(Intent.ACTION_SEND);
  shareIntent.setType("image/*");
  shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Some Image Subject");
  shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(someFile));
  startActivity(Intent.createChooser(shareIntent, "Share via..."));
Run Code Online (Sandbox Code Playgroud)

假设someFile存在且我已经按照http://developer.android.com/training/permissions/requesting.html上建议的运行时权限模型进行操作,并且用户同意允许我的权限,因此文件实际上是在系统.

有没有办法告诉我正在分享的应用程序,我已经将此权限授予我的用户,请您代表我授予此权限?

这不起作用:

  shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Run Code Online (Sandbox Code Playgroud)

根据文件:

int FLAG_GRANT_READ_URI_PERMISSION

如果设置,则此Intent的接收者将被授予对Intent数据中的URI和其ClipData中指定的任何URI执行读取操作的权限.

更有趣的是,如果设置此标记并且我与Gmail共享,则不会检测到该标记,并且Google不会提示请求权限,而是仅捕获异常并且不附加我的文件.

任何帮助,将不胜感激.

Ale*_*aro 2

您可以通过设置FileProvider.

像这样定义它AndroidManifest

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            ...
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider_paths" />
        </provider>
        ...
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

其中authorities是任意名称;然后创建一个 xml 文件,在其中定义要共享的文件的路径。例如,如果您想共享外部存储中的文件,则 file_provider_paths.xml 文件将如下所示:

<paths>
    <external-path name="share_image" path="/MYAppFolder/Images/" />
</paths>
Run Code Online (Sandbox Code Playgroud)

然后使用 yourFileProvider来获取您要共享的文件的内容 uri:

Uri uri = FileProvider.getUriForFile(context, "com.mydomain.fileprovider", file);
Run Code Online (Sandbox Code Playgroud)

有关文档的更多信息