Android折腾获取读写文件权限

939 阅读1分钟

时间:2024年1月10日

Android Studio == Build #AI-231.9392.1.2311.11076708, built on November 10, 2023

新建项目后,默认targetSdk是34。我只是想运行在安卓12,但是需要适配安卓13和安卓14.

网上搜了很多代码,运行出各种问题,最终整理出可以运行的代码。

原来安卓12只要获取READ_EXTERNAL_STORAGE这个权限就能读写。

代码如下:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">  

    <!-- Devices running Android 12L (API level 32) or lower -->  
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />  

    <!-- Devices running Android 13 (API level 33) or higher -->  
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />  
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />  

    <!-- To handle the reselection within the app on Android 14 (API level 34) -->  
    <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />  
  
    <application  
        android:requestLegacyExternalStorage="true"  
    >
        ...
    </application>  
</manifest>
android {  
    compileSdk 34  
    defaultConfig {  
        minSdk 31  
        targetSdk 34  
}
package com.kavin.test_module_1  
  
import android.Manifest.permission.READ_EXTERNAL_STORAGE  
import android.Manifest.permission.READ_MEDIA_IMAGES  
import android.Manifest.permission.READ_MEDIA_VIDEO  
import android.Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED  
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE  
import android.content.pm.PackageManager  
import android.graphics.Bitmap  
import android.graphics.BitmapFactory  
import android.net.Uri  
import android.os.Build  
import android.os.Bundle  
import android.os.Environment  
import android.util.Log  
import androidx.activity.result.contract.ActivityResultContracts  
import androidx.appcompat.app.AppCompatActivity  
import androidx.core.content.ContextCompat  
import com.kavin.krecordvideo.RecordVideo  
  
  
class MainActivity : AppCompatActivity() {  

    val requestPermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { results ->  
    // Handle permission requests results  
    // See the permission example in the Android platform samples: https://github.com/android/platform-samples  
    }  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        // Permission request logic  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {  
            requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))  
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {  
            requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO))  
        } else {  
            requestPermissions.launch(arrayOf(READ_EXTERNAL_STORAGE))  
        }  
        if (ContextCompat.checkSelfPermission(  
            this,  
            READ_EXTERNAL_STORAGE  
            ) == PackageManager.PERMISSION_GRANTED) {  
            val storagePath = Environment.getExternalStoragePublicDirectory(  
            Environment.DIRECTORY_MOVIES).absolutePath + "/test.mp4"  
        }  
    }  
}