小工具知识网

当前位置: 首页 > 行业知识 > FileProvider详解,看了绝对不会失望,从三流Android外包到秒杀阿里P7,

行业知识

FileProvider详解,看了绝对不会失望,从三流Android外包到秒杀阿里P7,

2026-11-03 20:00:09 来源:互联网转载
  • 起因

    FileProvider,goole在Android7.0对权限的升级推出的,但是学习中还是缺少思考。 今天测试丢过来一个bug,我一排查是关于这个FileProvider的,改问题中我突然心里问自己一个问题,FileProvider用过好多次了,它用来解决什么问题的?自己瞬间懵…感觉Android7.0以上好像就得用它(其实并非这么回事),我问同事同样的问题,把他也问懵了。所以决定把它拿出来讲一讲。

    • FileProvider为什么被设计出来?

      为了提高私有目录的安全性,防止应用信息的泄漏,从 Android 7.0 开始,应用私有目录的访问权限被做限制。具体表现为,开发人员不能够再简单地通过 file:// URI 访问其他应用的私有目录文件或者让其他应用访问自己的私有目录文件。

      同时,也是从 7.0 开始,Android SDK 中的 StrictMode 策略禁止开发人员在应用外部公开 file:// URI。具体表现为,当我们在应用中使用包含 file:// URI 的 Intent 离开自己的应用时,程序会发生故障。

      开发中,如果我们在使用 file:// URI 时忽视了这两条规定,将导致用户在 7.0 及更高版本系统的设备中使用到相关功能时,出现 FileUriExposedException 异常,导致应用出现崩溃闪退问题。而这两个过程的替代解决方案便是使用 FileProvider。

      • 私有目录和公共目录

        上面的关键点:应用程序的私有目录。 私有目录:data/app/包名" 和 "data/data/包名。随着app卸载被删除。 公共目录:包括外部公共目录、外部私有目录、缓存目录

        私有目录:随着用户删除app而删除

        context.getCacheDir(); /data/data/包名/cache

        context.getFilesDir(); /data/data/包名/files

        注意:Android7.0以上区分用户目录是这个: /data/user/0/包名/cache、/data/user/0/包名/files,这个不用太在意它,其实指向的还是data/data目录。

        外部私有目录:随着用户删除app而删除

        context.getExternalFilesDir(type); /storage/emulated/0/Android/data/包名/files

        context.getExternalCacheDir(); /storage/emulated/0/Android/data/包名/cache

        外部公共目录:

        Environment.getExternalStoragePublicDirectory(type);

        /storage/emulate/0/…

        有九种type,分别对应不同的目录,如下:

        DIRECTORY_MUSIC:音乐类型 /storage/emulate/0/music

        DIRECTORY_PICTURES:图片类型

        DIRECTORY_MOVIES:电影类型

        DIRECTORY_DCIM:照片类型,相机拍摄的照片视频都在这个目录(digital camera in memory)

        DIRECTORY_DOWNLOADS:下载文件类型 /storage/emulate/0/downloads

        DIRECTORY_DOCUMENTS:文档类型

        DIRECTORY_RINGTONES:铃声类型

        DIRECTORY_ALARMS:闹钟提示音类型

        DIRECTORY_NOTIFICATIONS:通知提示音类型

        外部根目录:

        Environment.getExternalStorageDirectory();/storage/emulate/0

        • FileProvider使用

          1.第一步

          //android:grantUriPermissions="true"允许它授予 Uri 临时的权限。

          2.第二步 :在res/xml 目录下添加共享目录标识文件file_path

          //代表设备的根目录new File("/");

          //context.getFilesDir()

          //context.getCacheDir()

          自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

          深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

          因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

          既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

          由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

          如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

          自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

          Q6qK-1711643820006)]

          自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

          [外链图片转存中…(img-QVacJNlF-1711643820006)]

          本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

上一篇:怎么知道服务器被谁攻击?

下一篇:小米Fastboot故障不用愁!一篇文章带你轻松解决!