如何读写另外一个app的文件?

330 阅读1分钟
原文链接: mp.weixin.qq.com

面试中曾经遇到一个问题,如何读写另外一个app的文件?

这个问题涉及到几个方面,我们拆开来说。

读写文件,

首先读写文件很简单,即使是初级开发也知道步骤如下· 声明权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

`

· 实例化 File类进行操作

try {    File installation = new File("文件路径", "文件名");    if(!installation.exists()) {        return;    }    ....} catch (Exception e) {    Log.d(TAG, "overrideInstallation: " + e.getMessage());}

OK,上面的代码中规中矩,只要有 File对象就可以用 FileOutputStream或者 FileReader来操作文件内容,但!如果是要读其他app的文件呢?

open failed EACCES (permission denied)

马上就会遇到这个问题,即使可以实例化 File,而且文件 exists为 true,权限也有的情况下,还是会报这个错误。

原因很简单,每个 app都有自己的linux user id,不同 user id的进程之间是不允许共享文件的。

既然是 user id不同,那么解决办法有了,我们可以在 AndroidManifest 中声明一样的 sharedUserId

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.xxx.xxx"    android:sharedUserId="xxx"></manifest>

sharedUserId

关于 sharedUserId可以说的有很多,它的应用大体有这两种· 获取相同 sharedUserId的 Context· 共享数据虽然平时作为独立开发者很少需要去关心它,不过在一些公司的产品群里面经常会使用相同的 sharedUserId,这样一来app之间就可以进行数据共享,也可以做一些其他的操作,比如保活,比如监控。