猛禽洛的程式筆記庫

[Android] 取得檔案管理權限(MANAGE_EXTERNAL_STORAGE)方式

MANAGE_EXTERNAL_STORAGE權限可以存取整個外部儲存裝置(包含所有檔案和資料夾)。

雖然Android上的MANAGE_EXTERNAL_STORAGE在使用上限制多多(例如上架認證手續非常繁雜),不過對於一些內部開發案,並不會上架Google上使用,不一定要大費周章寫SAF架構。

1.在AndroidManifest.xml新增權限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />

 

2.新增後不能馬上使用,需要徵求使用者同意:

//取得MANAGE_EXTERNAL_STORAGE權限
fun requestManageExternalStoragePermission() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Environment.isExternalStorageManager()) {
      val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
      intent.data = Uri.parse("package:$packageName")
      startActivityForResult(intent, 100)
    } else {
      // 已經擁有權限,可以執行存取檔案的操作
      Logger.d("Permission:已擁有 MANAGE_EXTERNAL_STORAGE 權限")
    }
  } else {
    // 如果是 Android 10 以下,則使用普通的儲存權限
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 100)
  }
}

//取得權限賦予狀態
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  super.onActivityResult(requestCode, resultCode, data)
  if (requestCode == 100) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
      if (Environment.isExternalStorageManager()) {
        Logger.d("Permission:已成功取得 MANAGE_EXTERNAL_STORAGE 權限")
      } else {
        Logger.d("Permission:無法取得 MANAGE_EXTERNAL_STORAGE 權限")
      }
    }
  }
}

 

當使用者開啟允許後,就可以自由讀寫檔案了。

-END-

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *