背景介绍:
TV项目的系统是Android N,里面有个产品需求:是做一个视频文件管理器,检测到U盘插入之后,读取里面的视频文件,展示出来,并且支持点击播放,就是如下样式(项目实际运行展示的效果)

我们知道,如果要播放一个视频文件,必须要给播放器 设置一个路径或者Uri,一般是Uri uri=Uri.parse(…)或者是 Uri uri=Uri.fromFile(…)等,如果是这样的话,在Android N上及其之后会抛出 FileUriExposedException 异常
这是因为在Android N 之后,Android 执行的StrictMode API 政策对外部应用公开file://Uri,如果包含这个uri的intent离开当前应用会报FileUriExposedException 异常,而如果在应用间共享文件,应该用content://Uri,并授予Uri临时访问权限,这个具体可以查看 官网 点击这里
按照官网讲解步骤,我们要用到FileProvider类,它是ContentProvider的子类,要按照以下几个步骤去做:

【1】、定义一个FileProvider ,并注册。
【2】、指定要访问的文件路径位置。
【3】、生成文件的Uri。
【4】、赋予Uri临时访问权限。
【5】、向访问程序提供Uri。

具体怎么弄,我就不讲了,官网讲的已经非常详细了,这个也不是本篇博客的重点,我重点讲下如何给FileProvider配置 需要访问的文件。
在 res 目录下 新建xml目录,建一个file_paths.xml。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<paths xmlns:android="http://schemas.android.com/apk/res/android"><files-path name="files" path="" /><cache-path name="cache" path="" /><external-path name="external" path="" /><external-files-path name="name" path="path" /><external-cache-path name="name" path="path" />
</paths>
</paths>

具体的含义如下,截图来自官网。
节点 配置比如 代表文件第一级路径,里面的path代表子目录。

这几个含义对应的路径为:
getCacheDir()方法用于获取/data/data//cache目录
getFilesDir()方法用于获取/data/data//files目录
Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录
Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录

扫视了一下,我怎么也没有找到UsbDisk的配置访问路径啊,官网介绍读了两遍还是没有看到啊,这个怎么办?无奈的我还是一如既往的去 源码中寻找答案,开启源码解读模式 (FileProvider.java)

    /*** Parse and return {@link PathStrategy} for given authority as defined in* {@link #META_DATA_FILE_PROVIDER_PATHS} {@code <meta-data>}.** @see #getPathStrategy(Context, String)*/private static PathStrategy parsePathStrategy(Context context, String authority)throws IOException, XmlPullParserException {// 省略部分代码int type;// 解析我们在res下面配置的 file_paths.xml 文件while ((type = in.next()) != END_DOCUMENT) {if (type == START_TAG) {final String tag = in.getName();final String name = in.getAttributeValue(null, ATTR_NAME);String path = in.getAttributeValue(null, ATTR_PATH);File target = null;if (TAG_ROOT_PATH.equals(tag)) {target = DEVICE_ROOT;} else if (TAG_FILES_PATH.equals(tag)) {target = context.getFilesDir();} else if (TAG_CACHE_PATH.equals(tag)) {target = context.getCacheDir();} else if (TAG_EXTERNAL.equals(tag)) {target = Environment.getExternalStorageDirectory();} else if (TAG_EXTERNAL_FILES.equals(tag)) {File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);if (externalFilesDirs.length > 0) {target = externalFilesDirs[0];}} else if (TAG_EXTERNAL_CACHE.equals(tag)) {File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);if (externalCacheDirs.length > 0) {target = externalCacheDirs[0];}}if (target != null) {strat.addRoot(name, buildPath(target, path));}}}return strat;}

根据我们配置的不同xml节点,去获得不同的访问路径,在这里我终于发现了一个强大的节点,就是TAG_ROOT_PATH
“root-path” 经过分析,代表的设备文件系统的根节点,就是我们adb shell 进去之后的根节点,知道这个之后,访问U盘就好配置了,如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><root-path name="externalfiles" path="/storage/"/>
</paths>

path 配置成 /storage/,这样就可以访问到U盘文件了,最终成功解决了问题,有点小激动~~!

Android 7.0后 播放U盘中的视频文件的解决方案相关推荐

  1. android 5.0 短信 nexus 5,Nexus 5升级Android 5.0后泪奔

    希望借助Project Volta(优化应用耗电量的程序)延长电池续航时间而升级到Android 5.0的Nexus 5手机用户会感到失望.数据证明用户的不满是有道理的,GSMArena网站最近对三星 ...

  2. android treble 三星,三星S8/Note8升Android 8.0后 确认不支持Project Treble特性

    目前各大国产智能手机厂商已开始准备升级Android 8.0,进行内部测试,明年将会有一大波手机可以用上Android 8.0.现在最新消息,有用户三星S8/Note8手机升Android 8.0后, ...

  3. 氢os android 7.0,一加氢OS用上Android 7.0后 网友惊呼:又快又省电

    原标题:一加氢OS用上Android 7.0后 网友惊呼:又快又省电 手机从系统角度看可分为IOS与Android两大阵营,而iOS只能苹果自己独享,其他厂家则使用了更加开 源的Android.尤其在 ...

  4. 正在升级android s7,喜欢!升级Android 8.0后,三星S7可以获取新的UI和Bixby: 功能太多...

    Galaxy S7和S7 edge是三星在2016年的旗舰手机. 工厂预装了Android 6.0系统,该系统已于今年1月正式升级为Android 7.0. 按照三星为每个旗舰店更新两个主要Andro ...

  5. android6.0 全局4k,索粉福音! Android 6.0后的索尼Z5 P为系统全局4K显示

    原标题:索粉福音! Android 6.0后的索尼Z5 P为系统全局4K显示 我们都知道,去年索尼移动发布的Xperia Z5 Premium(国行:Xperia Z5 尊享版,以下简称Xperia ...

  6. Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一)

    项目中有个需求,播放爱奇艺的视频,百度了一通,可能是搜索词有问题,没找到解决方法,后来无意中发现微信可以播放,就想到是否可以使用微信的x5内核,一试发现可以实现.想要实现的效果如下,点击全屏后全屏播放 ...

  7. android x5获取播放地址,Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一)...

    Android 使用WebView 实现播放爱奇艺视频,可全屏(使用的腾讯的X5内核) (一) 发布时间:2018-06-27 18:30, 浏览次数:1438 , 标签: Android WebVi ...

  8. Android VideoView播放 项目中的 视频文件 自动横屏 全屏播放

    记录最近遇到的一个android播放视频的需求: APP主页上方有一个操作演示字样的入口,点击后开始播放一段视频,视频文件是放在工程里的. 话说以前还没做过类似播放视频的功能,根据以往的经验来看,最简 ...

  9. Android 微信分享后留在微信,没有回调的问题解决方案

    Android 微信分享后留在微信,没有回调的问题解决方案 参考文章: (1)Android 微信分享后留在微信,没有回调的问题解决方案 (2)https://www.cnblogs.com/zhan ...

最新文章

  1. UIImage存为本地文件与UIImage转换为NSData
  2. CRM 客户端程序开发:获取表单界面上各种字段的值及其他属性
  3. 配置文件总结(机房重构知识点总结)
  4. 快速入门系列--MVC--03控制器和IOC应用
  5. postman接口参数化
  6. Volatile可见性底层实现原理
  7. 弟子规python编程游戏_《Python游戏趣味编程》 第11章 消灭星星
  8. MySQL巧妙利用help_topic表把以逗号分隔的字符串转换成行
  9. 【PyQt5】PyQt5 安装 以及使用 designer 开发 python GUI 界面
  10. 数字和为sum的方法数
  11. Ubuntu部署Java项目
  12. 腾讯看点CTO徐羽: QQ浏览器背后的推荐AI中台 | AICon
  13. 用iframe框架,登录过期后登录框在框架里加载的问题
  14. python面向对象——类(下)
  15. 北斗导航 | 基于奇偶矢量法的RAIM之SSE探索(附奇偶矢量法源代码)
  16. 当c语言学到大成时,教孩子学编程(信息学奥赛C语言版)
  17. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容乔哥都给你总结在这儿了...
  18. 前端知识总结之浏览器知识
  19. 数据增强-亮度-对比度-色彩饱和度-色调-锐度 不改变图像大小 --增加ssd目标框xml文件的同步处理方法。
  20. 多功能日期查询小工具

热门文章

  1. leetcode 《简单》 设计问题 Python实现
  2. PyCharm LicenseServer 破解
  3. MFC开发IM-第一篇
  4. yii2 关掉php notice,php – 使用Yii2中的自动填充更新隐藏字段
  5. 用PHP实现多级树型菜单
  6. 最聪明的如何成为优秀的——微软高管指点成材路
  7. 苹果官宣春季发布会!不止有iPhone SE 3,还有紫色iPhone 13 Pro?
  8. 雷军接连退出多家小米关联公司董事职务
  9. 苹果任命软件主管凯文•林奇为“苹果汽车”项目负责人
  10. 烧光86亿元,还是没造出来车!拜腾“造车梦”断?