将二进制文件保存到 /<<external-storage>>/Android/data/<<其他软件包>>



几年前,我创建了一个编写二进制文件的应用程序。我从来没有设法将其存储在另一个应用程序的数据位置(/<<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();
}

在我的清单文件中,我当然包括

<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));

两个用户确认他们向我的应用授予了外部存储写入权限。

  1. 所以我想我的代码不再那么健壮,无法将二进制文件写入外部存储。
  2. 看起来现在可以将文件写入其他程序外部数据位置。如果是这样,我想这样做。

那么在/<<external-storage>>/Android/data/<<some other program's package>>/files/中创建二进制文件的更好(或最佳)方法是什么?

感谢您的所有建议,但我发现了错误。它在我的程序中的其他地方。在我的清单文件中,我请求了WRITE_EXTERNAL_STORAGE权限,但在代码中,我要求用户提供READ_EXTERNAL_STORAGE权限。它总是有效,但也许这是他们最近解决的一些安全漏洞的一部分。我将来会使用CommonsWare关于SAF的建议。