似乎只有当其他应用程序手动询问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建议的建议的运行时权限模型,并且用户同意允许我的权限,因此实际上是在系统上创建了文件。 / p>
有没有办法告诉我要分享的应用程序,我已将此权限授予我的用户,请代表我授予此权限?
这不起作用:
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
根据文件:
int FLAG_GRANT_READ_URI_PERMISSION
如果设置,则此Intent的接收者将被授予对Intent的数据中的URI以及其ClipData中指定的任何URI执行读取操作的权限。
更有意思的是,如果设置此标记并且我与Gmail共享,则不会检测到该标记,并且Google不会提示请求权限,而是仅捕获异常并且不附加我的文件。
任何帮助都将不胜感激。
答案 0 :(得分: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>
其中authorities
是任意名称;然后创建一个xml文件,您可以在其中定义要共享的文件的路径。例如,如果要共享外部存储中的文件,file_provider_paths.xml文件将如下所示:
<paths>
<external-path name="share_image" path="/MYAppFolder/Images/" />
</paths>
然后使用您的FileProvider
获取您要分享的文件的内容:
Uri uri = FileProvider.getUriForFile(context, "com.mydomain.fileprovider", file);
有关docs
的更多信息