You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在用户点击禁用/允许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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:12:05