几年前,我创建了一个用于写入二进制文件的应用程序。我从未设法将其存储在另一个应用程序的数据位置 ( /<<external-storage>>/Android/data/<<some other app's package>>
),因此用户必须手动执行此操作。
我创建了该文件
BufferedOutputStream bos;
try {
bos = new BufferedOutputStream(new FileOutputStream(filePath + fileName));
bos.write(myData);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
当然,我也将其包含在我的 list 文件中
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
一切顺利,我和我的用户都很满意。但多年来,随着所有新 API 的出现,情况发生了变化......
一些用户开始提示没有创建文件。我在至少 3 台设备上发现了问题:三星 S9、S9+ 和 OnePlus 5T(有 OOS)。
我已经在我自己的 Pocophone F1 上使用 Android 9 测试了我的应用程序,没有任何问题。因此并非所有 Android 9 设备都有问题。
我从一些用户那里得到了堆栈跟踪,发现他们得到了 FileNotFoundException (Permission denied)
在这一行:
bos = new BufferedOutputStream(new FileOutputStream(filePath + fileName));
两名用户确认他们向我的应用授予了外部存储写入权限。
- 所以我猜我的代码对于将二进制文件写入外部存储不再那么健壮了。
- 现在看来可以将文件写入其他程序的外部数据位置。如果是这样,我愿意这样做。
那么在 /<<external-storage>>/Android/data/<<some other program's package>>/files/
中创建二进制文件的更好(或最佳)方法是什么? ?
最佳答案
感谢您的所有建议,但我发现了该错误。它在我的程序的其他地方。在我的 list 文件中,我请求 WRITE_EXTERNAL_STORAGE 权限,但在代码中,我请求用户 READ_EXTERNAL_STORAGE 权限。它总是有效,但也许这是他们最近解决的一些安全漏洞的一部分。将来我将使用 CommonsWare 关于 SAF 的建议。
关于java - 将二进制文件保存到/<<external-storage>>/Android/data/<<其他一些包>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55429806/