【问题标题】:Public path of Android QAndroid Q的公共路径
【发布时间】:2019-07-04 14:22:04
【问题描述】:

我试图将文件写入“/mnt/sdcard”路径,但返回错误。使用普通 fopen("new.txt","w") 在 JNI 层(C++)上编写代码

并且还尝试了相同的“/mnt/sdcard/Android/data/”甚至失败。

设备:Android Q Beta4

fopen("/mnt/sdcard/new.txt","w") fopen("/mnt/sdcard/Android/data/new.txt","w")

我们已经在 Android Q 的 Android 开发者页面中参考了存储限制。

公共信息使用哪条路径存储?

【问题讨论】:

  • 现在我们正在迁移 Android R 以进行测试,但我们面临“权限被拒绝”问题。路径:/mnt/sdcard/Android/data/package_name/files/package_name/* 注意:使用以下代码获取公共路径,Context context = _activity.getApplicationContext(); return context.getExternalFilesDir(null) +"/" + getPackageName();我们需要为 Android R(11) 做一些特别的事情吗?你能推荐一下吗?
  • @CommonsWare 请帮助我们?

标签: android java-native-interface


【解决方案1】:

应用无法将数据存储在 Android Q(默认情况下)或 Android R(适用于所有应用)的外部或可移动存储设备上的任意位置。您碰巧在使用 NDK 的事实并没有改变这一点。

您的 Java 代码应该传递一个有效的文件系统路径供您的 NDK 代码使用(例如,getExternalFilesDir() 上的 Context)。

【讨论】:

  • 感谢@CommonsWare,我们也尝试过。它工作正常。
  • @AswinPAshok:我不知道是什么导致了你所描述的行为——对不起!
  • @CommonsWare 我终于找到了这种行为的原因。我的申请通过设置被授予android.permission.REQUEST_INSTALL_PACKAGES。在向我的其他应用授予相同权限后,它可以复制文件。当我拒绝此权限时,应用程序开始崩溃。我认为文档没有在任何地方提到它。
  • @CommonsWare 我认为 Google 是这么做的,因为getPackageArchiveInfo 仍然使用文件路径,而且 Google 没有提供任何其他 SAF 兼容的 API。由于该 API 被许多具有REQUEST_INSTALL_PACKAGES 权限的应用程序使用,因此让这些应用程序使用具有文件 API 的文件系统是有意义的。 (这是我的假设)
  • @AswinPAshok:好的,我终于有时间重现这个问题了。发生的情况是,如果您已获得 REQUEST_INSTALL_PACKAGES,您将自动选择使用旧版存储,就像您拥有 android:requestLegacyExternalStorage="true" 一样。如果您不持有REQUEST_INSTALL_PACKAGESEnvironment.isExternalStorageLegacy() 将返回true,而不是false。据推测,这将在 Android R 中得到清理,届时整个“遗留外部存储”的东西都应该消失了。
猜你喜欢
  • 2017-01-20
  • 2023-03-09
  • 2017-03-26
  • 2018-07-29
  • 2016-09-02
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多