Android 11 引入了強制執行分區存儲的限制,導致應用默認不能訪問外部文件。
針對以前涉及較多文件的操作,可采用申請所有文件訪問權限的方式來解決這一問題,實現方式如下。
(雖然這樣做安全性低,官方并不推薦這樣,但確實最快適配原有應用程序的方式)
1. AndroidManifest.xml中添加如下內容:
用于聲明應用程序需要使用 MANAGE_EXTERNAL_STORAGE 權限。同時,使用了 tools:ignore=“ScopedStorage” 來忽略與分區存儲(Scoped Storage)相關的 Lint 檢查。
<!-- Android11額外添加 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" />
2. 申請所有文件訪問權限,該操作會跳轉到所有文件權限申請頁面
// 請求文件訪問權限的請求碼,可以是任意整數值private static final int REQUEST_MANAGE_FILES_ACCESS = 2;//申請所有文件訪問權限public void requestPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//判斷是否有管理外部存儲的權限if (!Environment.isExternalStorageManager()) {Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);intent.setData(Uri.parse("package:" + getPackageName()));startActivityForResult(intent, REQUEST_MANAGE_FILES_ACCESS);} else {// TODO: 2023/11/22 // 已有所有文件訪問權限,可直接執行文件相關操作}} else {// TODO: 2023/11/22 //非android11及以上版本,走正常申請權限流程}}
3. 獲取用戶授權情況
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_MANAGE_FILES_ACCESS) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {if (Environment.isExternalStorageManager()) {// TODO: 2023/11/22 // 用戶已經授予文件訪問權限// 在這里執行創建文件夾和初始化數據庫的操作} else {// TODO: 2023/11/22 // 用戶尚未授予文件訪問權限// 可以在此處處理用戶未授予權限的情況}}}}