如何在用户点击禁用/允许WRITE_EXTERNAL_STORAGE权限时调用监听器?
监听WRITE_EXTERNAL_STORAGE权限授权结果
一、使用AndroidX ActivityResultContracts(推荐方案)
这是Android官方推荐的权限请求回调方式,替代旧版的onRequestPermissionsResult。
1. 注册权限回调监听器
在Activity或Fragment中定义ActivityResultLauncher,回调里直接处理允许/拒绝逻辑:
// Kotlin 示例 private val requestWriteStorageLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted -> when (isGranted) { true -> { // 用户允许权限,执行对应操作 } false -> { // 用户拒绝权限,触发你需要的监听器逻辑 } } }
// Java 示例 private ActivityResultLauncher<String> requestWriteStorageLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { // 权限允许后的操作 } else { // 权限拒绝,触发目标监听器 } } );
2. 发起权限请求
当需要申请权限时,先检查权限状态,未授权则调用launch方法:
// Kotlin if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) { requestWriteStorageLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) }
// Java if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestWriteStorageLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE); }
二、旧版onRequestPermissionsResult(兼容老项目)
如果维护的是未接入AndroidX的旧项目,可使用此方式:
1. 发起权限请求
// Kotlin private val REQUEST_CODE_WRITE_STORAGE = 1001 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_CODE_WRITE_STORAGE ) }
// Java private static final int REQUEST_CODE_WRITE_STORAGE = 1001; if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_STORAGE ); }
2. 重写回调方法处理结果
// Kotlin override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CODE_WRITE_STORAGE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限允许逻辑 } else { // 权限拒绝,触发监听器 } } }
// Java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_WRITE_STORAGE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限允许后的操作 } else { // 权限拒绝,执行监听器逻辑 } } }
补充:处理“不再询问”场景
若用户拒绝权限并勾选“不再询问”,后续请求不会弹出系统对话框,可引导用户前往应用设置页开启权限:
// Kotlin if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { data = Uri.fromParts("package", packageName, null) } startActivity(intent) }
// Java if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); }
内容的提问来源于stack exchange,提问作者Fiqih Hasroni
相关产品推荐
相关产品推荐

