IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗? -> 正文阅读

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

在上篇文章【安卓基础】一文搞懂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的内部存储和私有目录。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:26:11  更:2022-03-03 16:30:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:49:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码