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

标签 java android

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

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

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

那么在 /<<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/

相关文章:

java - 布局忽略了希望增长的控件?

java - 使用 SpringMVC 基于注解的配置进行阐述

java - 错误构建 APK {重复条目 : com/google/android/gms/gcm/INetworkTaskCallback$Stub. 类}

android - 将动态 View 添加到 android tabhost

android - 长和长的区别?

java - 如何读取注释文件?

java - 'synchronized' 是什么意思?

java - Java中的递归Chudnovsky算法

java - Eclipse 声明的包与预期的包不匹配

android - 使用 robotium 测试 appwidget