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