Android >= 11 在没有 manage_external_storage 权限的情况下在文件夹之间导航以查找文件
Android >= 11 navigate between folder to find file without manage_external_storage permission
我有一个应用程序需要更新一些机器固件。
在定位 API 29 之前没有问题,现在 Google Play Store 至少需要定位 API30... 斗争开始了。
我使用的文件管理器选择器不再兼容(自 2020 年 2 月以来未维护),我找到了一个工作正常但需要 MANAGE_EXTERNAL_STORAGE 权限(除非它在文件夹之间导航但看到它们都是空的)。
Google 不允许将应用发布到 Play 商店,因为管理文件不是应用的主要范围。
我需要让用户浏览文件夹以搜索包含固件更新的 zip 文件,select 然后让应用打开它并执行更新。
该文件可以在设备上随处可见,由用户决定将其放置在何处。
该解决方案必须与 Android 8+ 兼容(因此从实际 12 开始)。
我该如何解决这个问题?
提前致谢!
按照@blackapps 的建议,删除 MANAGE_EXTERNAL_STORAGE 权限并切换到系统文件选择器解决了问题。
在 MainActivity 上
private void fileIntent() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/pdf");
}
在文件选取中
fun pickFirmwareFromStorage(context: Activity) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/zip"
// Optionally, specify a URI for the file that should appear in the
// system file picker when it loads.
val pickerInitialUri = "Download"
putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
}
startActivityForResult(context, intent, PICK_FIRMWARE_REQUEST_CODE, null)
}
我有一个应用程序需要更新一些机器固件。 在定位 API 29 之前没有问题,现在 Google Play Store 至少需要定位 API30... 斗争开始了。
我使用的文件管理器选择器不再兼容(自 2020 年 2 月以来未维护),我找到了一个工作正常但需要 MANAGE_EXTERNAL_STORAGE 权限(除非它在文件夹之间导航但看到它们都是空的)。 Google 不允许将应用发布到 Play 商店,因为管理文件不是应用的主要范围。
我需要让用户浏览文件夹以搜索包含固件更新的 zip 文件,select 然后让应用打开它并执行更新。 该文件可以在设备上随处可见,由用户决定将其放置在何处。 该解决方案必须与 Android 8+ 兼容(因此从实际 12 开始)。
我该如何解决这个问题? 提前致谢!
按照@blackapps 的建议,删除 MANAGE_EXTERNAL_STORAGE 权限并切换到系统文件选择器解决了问题。
在 MainActivity 上
private void fileIntent() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/pdf");
}
在文件选取中
fun pickFirmwareFromStorage(context: Activity) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/zip"
// Optionally, specify a URI for the file that should appear in the
// system file picker when it loads.
val pickerInitialUri = "Download"
putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
}
startActivityForResult(context, intent, PICK_FIRMWARE_REQUEST_CODE, null)
}