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