旧的解决方案
从各种博客上都会搜到这样的答案:
Intent intent = new Intent(Intent.ACTION_VIEW);
String type = "video/*";
Uri name = Uri.fromFile(new File(path));
intent.setDataAndType(name, type);
startActivity(intent);
在android7.0以下这么做是没有问题的。但是在android7.0以及以上的手机就是抛出FileUriExposedException的异常。因此需要对uri进行处理。
获取FileUri
google提供了FileProvider,使用它可以生成content://Uri来替代file://Uri
官方介绍:https://developer.android.com/reference/android/support/v4/content/FileProvider.html
Androidmainfest文件中添加Provider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.file-provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
res中创建一个xml/provider_paths.xml文件,内容如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
这样就可以用
FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID +
".file-provider", new File(vo.getActualPath());
来获取uri了。
最终结论
刚开始没有加read_uri_permission的flag,调用不起来。最终代码:
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID +
".file-provider", new File(vo.getActualPath()));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, "video/*");
getActivity().startActivity(intent);
亲测可用
网友评论