前面介绍了 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, "工作")}
}