前面介紹了 Android 運行時權限。
其中,申請權限的步驟有些繁瑣,需要用到:ActivityCompat.requestPermissions
函數和 onRequestPermissionsResult
回調函數,今天就借助 ActivityResultLauncher
來簡化書寫。
步驟1:創建 ActivityResultLauncher
首先,你必須在 onCreate
函數的前面創建 ActivityResultLauncher
對象。
通過 registerForActivityResult
函數可以創建 ActivityResultLauncher
對象。
/*** 申請權限*/
private val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()
) {if (it) {Log.d(TAG, "申請成功")} else {Log.d(TAG, "申請失敗")}
}
第一個參數指定申請權限的啟動器RequestPermission
。
第二個參數是回調函數,通過回調函數獲取結果。例如,申請權限的回調函數只有一個 Boolean
類型的參數,表示權限申請是否成功。之后,你可以在回調函數里處理相關邏輯。
步驟2:啟動 ActivityResultLauncher
通過 ActivityResultLauncher
對象的 launch
方法可以啟動申請權限的啟動器。
requestPermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
launch
函數接收一個參數,這個參數表示你要申請哪個權限。例如READ_EXTERNAL_STORAGE
。
綜合案例
AndroidManifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><!-- 讀寫文件 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></manifest>
activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/main_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="申請權限"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
MainActivity
:
class MainActivity : AppCompatActivity() {private val TAG = "MainActivity"/*** 申請權限*/private val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {if (it) {Log.d(TAG, "申請成功")work()} else {Log.d(TAG, "申請失敗")}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val button: AppCompatButton = findViewById(R.id.main_btn)button.setOnClickListener {requestPermission()}}private fun requestPermission() {if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "有權限")work()} else {Log.d(TAG, "無權限")requestPermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE)}}private fun work() {Log.d(TAG, "工作")}
}