【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗? 您所在的位置:网站首页 aibuilder安卓可以下载吗 【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗?

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

#【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗?| 来源: 网络整理| 查看: 265

在上篇文章【安卓基础】一文搞懂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 file1.createNewFile()} ${file1.exists()}") }

从运行结果来看,api=30是彻底不能操作其他应用的私有目录和内部存储了。 在这里插入图片描述 28可以,30不行,但29呢? 在这里插入图片描述 29的表现也28相同。

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有