【问题标题】:Permissions on Android M when sharing Data to other apps与其他应用共享数据时 Android M 上的权限
【发布时间】:2015-10-08 20:11:23
【问题描述】:

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

例如,我有以下意图分享一些数据:

  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..."));

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

有没有办法告诉我正在共享的应用程序,我已向我的用户授予此权限,您能代表我授予此权限吗?

这不起作用:

  shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

根据文档:

int FLAG_GRANT_READ_URI_PERMISSION

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

更有趣的是,如果设置了这个标志并且我共享到 Gmail,则不会检测到该标志并且 Google 不会提示请求权限,而是只会捕获异常并且不会附加我的文件。

任何帮助将不胜感激。

【问题讨论】:

  • 嗨。你找到解决方案了吗?我面临着类似的错误。我想将视频分享到 Youtube。并且 Youtube 因 SecurityException: 权限被拒绝而崩溃。它需要 READ_EXTERNAL_STORAGE 权限或授予权限。

标签: android android-6.0-marshmallow android-sharing


【解决方案1】:

您可以通过设置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>

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

<paths>
    <external-path name="share_image" path="/MYAppFolder/Images/" />
</paths>

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

Uri uri = FileProvider.getUriForFile(context, "com.mydomain.fileprovider", file);

有关docs的更多信息

【讨论】:

  • 我猜是因为某人缺乏感情
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2018-07-13
  • 2020-09-26
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多