2--安卓7.0+的android.os.FileUriExposedException的解决方法

通过intent打开内置音乐播放器,传递一个Uri,但是崩了:android.os.FileUriExposedException 貌似是安卓7.0+的锅,处理方法如下: 以本例包名com.toly1994.audio为例, 以本例包名com.toly1994.audio为例, 以本例包名com.toly1994.audio为例,重要的话说三遍!,大家对应自己包名修改

1.AndroidManifest.xml的<application中:
<provider android:name="android.support.v4.content.FileProvider"
          android:authorities="com.toly1994.audio.fileProvider"
          android:grantUriPermissions="true"
          android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
2.在res下新建xml文件夹及file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/com.toly1994.audio/" name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>
3.封装
public class Compat {
    public static void fileUri(Context context, Intent intent, File file, String type) {
        //判断是否是AndroidN以及更高的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", file);
            intent.setDataAndType(contentUri, type);
        } else {
            intent.setDataAndType(Uri.fromFile(file), type);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
    }
}
4.使用
File file = new File(PathUtils.getSDPath(), "toly/test.mp3");
Intent intent = new Intent(Intent.ACTION_VIEW);
Compat.fileUri(this, intent, file, "audio/mp3");
startActivity(intent);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发学习

添加Intent.FLAG_ACTIVITY_CLEAR_TOP 都做了些什么背景整体流程

1563
来自专栏酷玩时刻

Android极速开发之桌面快捷方式

测试发现快捷方式并没有创建,Bitmap必须是资源文件中BitmapDrawable转化过来的才会创建成功

843
来自专栏mukekeheart的iOS之旅

iOS学习——获取当前最顶层的ViewController

  在iOS开发过程中,我们经常性会需要获取当前页面的ViewController,然后利用ViewController进行一些操作,例如在最顶层的ViewCo...

7185
来自专栏岑志军的专栏

iOS单独对年月日加减

2106
来自专栏静晴轩

Android之Intent用法全面总结

[代码] 调用拨号程序 // 给移动客服10086拨打电话 Uri uri = Uri.parse("tel:10086"); Intent intent = ...

3407
来自专栏项勇

笔记71 | Intent分享内容(文本,图片,视频)

1847
来自专栏上善若水

009android初级篇之APP中使用系统相机相册等集成应用

这是第一种方式 在启动相机前先指定好图片的文件位置,通知intent,同时也保留在成员变量中。然后在函数中,可以直接打开该文件

1304
来自专栏知识分享

Android应用更新-自动检测版本及自动升级

http://www.cnblogs.com/keyindex/articles/1819504.html

1002
来自专栏水击三千

Intent组件

Android页面之间的跳转可以分为几类,比如有A和B两个页面,从A页面直接跳转到B页面,这样的跳转比较简单,或者从A页面跳转到B页面但是需要传送数据。在And...

2976
来自专栏非著名程序员

WebView 的 input 上传照片的兼容问题

问题 前几天接到的一个需求,是关于第三方理财产品的 H5 上传照片问题。 对方说他们的新的需求,需要接入方配合上传资产照片的需求,测试之后发现我们这边的 ap...

3365

扫码关注云+社区