首先在 AndroidManifest.xml 中添加需要的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CAMERA"/>

<!-- Always include this permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然后使用 Kotlin 在 Activity 申请权限

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Check and request permissions
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!hasAllPermissions()) {
                requestAllPermissions()
            } else {
                // Permissions already granted
                proceedWithAppFunctionality()
            }
        } else {
            // Permissions not needed for pre-Marshmallow devices
            proceedWithAppFunctionality()
        }

        // Other

    }
    
    // Other
    
    /* 申请权限开始 */
    private val permissions = arrayOf(
        android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
        android.Manifest.permission.READ_EXTERNAL_STORAGE,
        android.Manifest.permission.RECORD_AUDIO,
        android.Manifest.permission.INTERNET,
        android.Manifest.permission.CHANGE_WIFI_STATE,
        android.Manifest.permission.ACCESS_WIFI_STATE,
        android.Manifest.permission.ACCESS_NETWORK_STATE,
        android.Manifest.permission.CAMERA,
        android.Manifest.permission.ACCESS_COARSE_LOCATION,
        android.Manifest.permission.ACCESS_FINE_LOCATION
    )

    private fun hasAllPermissions() : Boolean {        
        return permissions.all {
            ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
        }
    }

    private fun requestAllPermissions() {        
        ActivityCompat.requestPermissions(this, permissions, PERMISSIONS_REQUEST_CODE)
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == PERMISSIONS_REQUEST_CODE) {
            if(grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
                // All permissions granted
                proceedWithAppFunctionality()
            } else {
                // At least one permission denied
                Toast.makeText(this, "All permissions are required for this app to function properly",
                    Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun proceedWithAppFunctionality() {
        // Proceed with the functionality that requires permissions
        Toast.makeText(this, "All permissions granted, proceeding...", Toast.LENGTH_SHORT).show()
    }

    companion object {
        const val PERMISSIONS_REQUEST_CODE = 102
    }
    /* 申请权限结束  */
    
    
    override fun onDestroy() {
        super.onDestroy()       
    }

}

最后,从 Android 10 开始,要想访问外部存储的所有文件,除了动态申请权限和权限申明外,必须在主工程 AndroidManifest.xml 中加上一句话:

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        ...
        android:requestLegacyExternalStorage="true"
        ...>

代码是根据 GPT-4o 更改的

标签: none

评论已关闭