面试中曾经遇到一个问题, 如何读写另外一个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的文件呢?
马上就会遇到这个问题, 即使可以实例化 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的 Context · 共享数据 虽然平时作为独立开发者很少需要去关心它,不过在一些公司的产品群里面经常会使用相同的 sharedUserId, 这样一来app之间就可以进行数据共享,也可以做一些其他的操作,比如保活,比如监控。