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

标签 android android-6.0-marshmallow android-sharing

似乎只有当其他应用程序手动请求 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..."));

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

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

这不起作用:

  shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

根据文档:

int FLAG_GRANT_READ_URI_PERMISSION

If set, the recipient of this Intent will be granted permission to perform read operations on the URI in the Intent's data and any URIs specified in its ClipData.

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

如有任何帮助,我们将不胜感激。

最佳答案

您可以通过设置 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 的更多信息

关于android - 与其他应用共享数据时 Android M 上的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33025097/

相关文章:

java - 将正交相机合并到现有的 java 游戏中

android - react native 获取请求非常慢的android

java - Android:与其他应用程序上的 Intent 共享位图

android - 为服务指定 SEND(共享) Intent 过滤器

android - 如何从链接分享图片,即不下载图片只需使用按钮分享

android - 使用 GCM 注册 ID 作为唯一 ID 对数据库进行 CRUD 操作?

java - 移动 Zip 文件 (Android Studio Java)

android - 如何将 Android M 默认 USB 配置设置为 MTP 而不是 "charging only"?

android - 无法从 Activity 发送短信,说 "could not start conversation"

Android 6+权限概念和位置策略