通过Android N提供的类FileProvider来处理就可以啦,即把file://开头转化成content://开头。
具体处理过程如下:
1.1 在AndroidManifest.xml里面添加如下代码:
<!--应用间文件共享--> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.qiyi.video.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>
2.1 在资源文件夹xml下面创建相应的文件。(比如filepaths.xml)
比如创建filepaths.xml文件,文件内容如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_files_path" path=""/> <external-path name="my_external_path" path="" /> <cache-path name="my_cache" path=""/> </paths>
<files-path/>代表的根目录: Context.getFilesDir()
<external-path/>代表的根目录: Environment.getExternalStorageDirectory()
<cache-path/>代表的根目录: getCacheDir()
Path=””,代表根目录下面所有的文件和文件夹都可以访问。
3.1 在应用程序中添加如下代码
Uri uri = FileProvider.getUriForFile(ctx, "com.qiyi.video.fileprovider", new File(fileName));
注意:在Intent中通过setData携带该uri参数的时候,需要设置
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
以及startActivity语句后,调用下面方法,来进行授权。
List<ResolveInfo> resInfoList = mActivity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
mActivity.grantUriPermission(packageName, avatarUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}