在上篇文章【安卓基础】一文搞懂Android历代版本文件访问权限变化我们对同一个应用的的文件访问权限做了比较。
那么不同应用之间文件访问又有什么限制呢?我们准备分二到三篇文件来阐述。
这篇文章,主要来看下不同系统版本下,我们直接通过路径来访问其它应用的内部存储、外部存储私有目录,看看能不能访问以及不同系统版本的区别。

可能说得有些啰嗦,心急的同学可以直接看大红字哟。

项目地址:https://github.com/codersth/android-foundation-samples/blob/master/app/src/main/java/com/codersth/android/foundation/filesystem/InterAppFileAccessActivity.kt

1.1 api < 19

我们在api18的虚拟机上,当前应用的私有目录下放一个文件。

然后通过路径的方式尝试直接读取这个文件。

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_inter_app_file_access)// 读取当前应用私有目录的文件Log.d(TAG, "onCreate: ${readFile("/sdcard/Android/data/com.codersth.android.foundation/files/hello.txt")}")// 读取其他应用私有目录的文件(确保手机上其他应用的私有目录下有对应文件)}/*** 读取指定路径下的文件内容* @param path 待读取文件的路径,路径可能是其他应用程序的私有目录* @return 文件文本内容,如果文件读取失败返回null*/private fun readFile(path: String): String? {File(path).takeIf { it.exists() }?.also {return FileUtil.readFileContent(File(path))}Log.d(TAG, "readFile: $path not exists.")return null}

可以看到,直接通过路径访问自己的私有目录是可以读取文件的。

接下来,我们访问本机上其他应用私有目录的文件,上传一个文件先。

接下来我们把上面的读取路径改成另一个应用的私有目录下的文件。

Log.d(TAG, "onCreate:其他应用的私有目录 ${readFile("/sdcard/Android/data/com.example.demo/files/hello.txt")}")

我们看到同样可以访问。

所以说,能不能直接访问其他应用私有目录,也是要看版本的,至少api 18上还是可以删除的,低版本应该也可以,大家不妨试下。
甚至我们可以直接把文件删除。

 // 删除其他应用私有目录的文件
Log.d(TAG, "onCreate:其他应用的私有目录 ${File("/sdcard/Android/data/com.example.demo/files/hello.txt").delete()}")

不妨再延伸下,试试操作其他应用的内部存储

// 读取其他应用内部存储的文件(确保手机上其他应用的私有目录下有对应文件)
Log.d(TAG, "onCreate:其他应用的私有目录 ${readFile("/data/data/com.example.demo/files/hello.txt")}")
// 删除其他应用内部存储的文件
Log.d(TAG, "onCreate:其他应用的私有目录 ${File("/data/data/com.example.demo/files/hello.txt").delete()}")

结果竟然成功了,就问你意不意外,惊不惊喜


所以我们可以总结下了:Android4.4(api19)以下完全可以通过路径直接操作其他应用的私有目录和内部存储。

19 <= api <=23

既然api19以下如此为所欲为,我们看下Android4.4是不是安全一些。
使用上述方法,以下是执行结果。

可以看到,针对其他应用私有目录,读取和删除是可以的;针对内部存储,读取成功,删除失败

接下来们在api=23(6.0)手机复现上述步骤,通过下面的日志可以发现,在第一步读取的时候就报权限问题了。

在《【安卓基础】一文搞懂Android历代版本文件访问权限变化》
这篇文章中我们测试过,api > 18访问应用自身外部存储的私有目录是不需要读写权限的,那导致上面的错误是权限问题还是系统做了其它安全策略呢?
我们不妨动态给个写入权限,结果与api=19上一致。

总结:19 <= api <=23上,A应用可以直接通过路径读写应用B的私有目录,也可以读取应用B的内部存储,但无法删除内部存储。

24 <= api <=30

由于android N对存储访问策略做了进一步限制,我们在api=24的机器上也试下,提得一得的是,不同系统版本的私有目录路径可能不同。
路径稍微改下(以测试设备为准):

Log.d(TAG, "onCreate:其他应用的私有目录 ${readFile("/sdcard/Android/data/com.example.demo/files/hello.txt")}")// 删除其他应用私有目录的文件
Log.d(TAG, "onCreate:其他应用的私有目录 ${File("/sdcard/Android/data/com.example.demo/files/hello.txt").delete()}")// 读取其他应用内部存储的文件(确保手机上其他应用的内部存储下有对应文件)
Log.d(TAG, "onCreate:其他应用的内部存储 ${readFile("/data/user/0/com.example.demo/files/hello.txt")}")// 删除其他应用内部存储的文件
Log.d(TAG, "onCreate:其他应用的内部存储 ${File("/data/user/0/com.example.demo/files/hello.txt").delete()}")

从下面的日志来看,android N开始对访问其它应用内部存储的读取作了限制。
我们在api = 28上再试下,同样如此(但没有报错)。

最后我们在30上再看下,如果30的虚拟机上无法查看私有目录,可以在被访问的应用下执行下面代码,然后把路径贴到上面的测试代码中:

private fun saveFile() {val file1 = File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "hello.txt")Log.d(TAG, "saveFile: $file1 saved status: ${file1.createNewFile()} ${file1.exists()}")}

从运行结果来看,api=30是彻底不能操作其他应用的私有目录和内部存储了。

28可以,30不行,但29呢?

29的表现也28相同。

由此我们可以给出结论了:
总结:api 24开始,应用A无法直接通过路径访问应用B的内部存储,android 30开始,应用A无法直接通过路径访问应用B的内部存储和私有目录。

【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗?相关推荐

  1. 安卓基础学习 Day18|按键事件+手势操作(图片的放大、缩小、切换)

    目录 一.按键事件的概念 二.案例演示 1.提出要求 2.主布局资源文件 3.主界面 一.触摸事件的概述 触摸分类 触摸动作 触摸监听器 触摸方法 触点个数与坐标 二.单点触摸 案例:移动米老鼠 提出 ...

  2. Android Q私有目录与公共目录文件的交互(读取,复制,保存等)——Pittkai

    Android Q即将推出正式版,本文是基于Q接近最终版本的beta6版本作为记录写的,如果对看到本文的人有帮助那当然是更好了.                一.Android Q的私有目录     ...

  3. Android游戏开发基础part4--Bitmap位图的渲染与操作

    游戏开发基础part4--Bitmap位图的渲染与操作 知识点1:Bitmap与BitmapFactory 如果想通过一张图片资源文件创建一个位图,则要通过位图工厂来索引图片资源文件,从而生成一张位图 ...

  4. 安卓(android)开发应该怎么学?需要哪些基础知识?

    随着智能手机的流行,现在很多大大小小的开发商都需要在手机上具备客户端,这里是一片强大的吸金磁场,那么很多想学习android的朋友,都会有个疑问,那就是:安卓(android)应该怎么学,需要哪些基础 ...

  5. Android之单元测试及数据库操作,android的单元测试

    1.新建android Test project 2. 选择针对测试的项目 3.新建类继承AndroidTestCase即可: package com.howlaa.sms.test; import ...

  6. Android存储空间及路径总结

    一.总结(Android10之前) 路径取得方法 APP专用 非root用户可见 APP卸载时 内部数据空间 Context.getFilesDir() yes no 消失 内部缓存空间 Contex ...

  7. Android APP存储路径和缓存清理规范

    1. Android APP统一存储数据规范 基于Android系统对存储卡访问的各种特性,在充分保证基线的产品交互体验前提下,定义Android APP各业务开发中的可选存储路径,对应存储特性,各自 ...

  8. 夜神安卓(android)模拟器 摇一摇

    夜神安卓(android)模拟器 摇一摇 以微信摇一摇为例: 第一步:进入微信摇一摇,摇一摇快捷键是Ctrl+8. 第二步:点击模拟器右侧工具栏中操作助手(脚本录制)的功能. 1.打开操作助手后按F1 ...

  9. 安卓基础知识(一) 服务(Service)

    安卓基础知识(一) 服务(Service) 一.基本概念: 1.服务就是长期于后台运行的程序,可以理解为是一个,用于执行长期任务,并且与用户没有交互的组件.每一个服务需要在配置文件AndroidMan ...

最新文章

  1. 跳槽季最狗血的面试经历,没有之一...
  2. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)
  3. 以太坊智能合约开发第七篇:智能合约与网页交互
  4. 十五、JavaScript进度条的制作
  5. subList生成的列表和原列表的对比
  6. 分布式锁 哨兵模式_手撕redis分布式锁,隔壁张小帅都看懂了!
  7. python 安卓模拟器电脑版_【夜神安卓模拟器电脑版】夜神安卓模拟器电脑版 V6.6.0.6免费版官方免费下载_正式版下载-多特软件站...
  8. 二、2.4版本之前的apache的安装
  9. 常见批处理作业调度算法
  10. 关于boot.ini文件里的/noexecute=optin
  11. 遗传算法的C语言设计
  12. MATLAB从入门到精通 第1章 MATLAB入门
  13. 国网天津电缆公司带电检测典型案例分析
  14. cisco 路由器时区设置
  15. 【Word】word2010中如何去掉标题前面的小黑点
  16. 计算机软件项目实施工程师要掌握哪些知识
  17. 陕西电力同业对标管理系统
  18. Android 根据网络图片URL转Bitmap对象
  19. 苹果最新框架教程之 ProximityReader是什么
  20. 腾讯代码安全指南开源,涉及 C/C++、Go 等六门编程语言

热门文章

  1. 使用C#编写17种Hello World程序(初学者C#测试石)
  2. 汇编语言实现计算2的3次方
  3. WXS:微信小程序版JavaScript
  4. 字节跳动日常实习一二三面面经(后端开发)
  5. 把个人网站封装生成百度小程序的方法分享
  6. [附源码]JAVA+ssm计算机毕业设计鞍山丘比特房屋租赁管理系统(程序+Lw)
  7. MYSQL的开题报告题目,开题报告的选题意义.docx
  8. SQL service基础(二)对数据指定列查询、条件查询、查询结果排序、聚集函数查询、分组统计查询
  9. 戴尔寄希望于区块链在印度服务器市场保持竞争力
  10. ImportError: No module named urlgrabber.grabber