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

Android双权限请求技术咨询:短信发送与联系人读取权限

没问题,我来帮你搞定同时申请短信发送和联系人读取权限的完整方案,直接上可复用的代码和清晰的逻辑说明:

完整实现方案:同时申请短信发送与联系人读取权限

首先第一步,先在AndroidManifest.xml里声明需要的权限(这一步绝对不能漏!):

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

接下来是Activity里的核心代码,我拆成几个模块,方便你理解和复用:

1. 定义权限请求码常量

先定义一个唯一的请求码,用来识别这次权限申请的回调:

private static final int REQUEST_SMS_CONTACTS_PERMISSIONS = 1;

2. 权限检查与申请方法

写一个专门的方法处理权限检查和申请逻辑,代码更清晰易维护:

private void checkAndRequestPermissions() {
    // 分别检查两个权限的当前状态
    int smsPermissionStatus = ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS);
    int contactsPermissionStatus = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);

    // 收集未被授予的权限
    List<String> pendingPermissions = new ArrayList<>();
    if (smsPermissionStatus != PackageManager.PERMISSION_GRANTED) {
        pendingPermissions.add(Manifest.permission.SEND_SMS);
    }
    if (contactsPermissionStatus != PackageManager.PERMISSION_GRANTED) {
        pendingPermissions.add(Manifest.permission.READ_CONTACTS);
    }

    if (!pendingPermissions.isEmpty()) {
        // 判断是否需要向用户解释权限用途(比如用户之前拒绝过权限)
        boolean needShowRationale = false;
        for (String perm : pendingPermissions) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, perm)) {
                needShowRationale = true;
                break;
            }
        }

        if (needShowRationale) {
            // 弹出对话框说明权限用途,提升用户授权意愿
            new AlertDialog.Builder(this)
                    .setTitle("权限申请说明")
                    .setMessage("应用需要发送短信和读取联系人权限来完成核心功能,请您允许授权。")
                    .setPositiveButton("同意授权", (dialog, which) -> {
                        // 发起批量权限申请
                        ActivityCompat.requestPermissions(
                                MainActivity.this,
                                pendingPermissions.toArray(new String[0]),
                                REQUEST_SMS_CONTACTS_PERMISSIONS
                        );
                    })
                    .setNegativeButton("取消", null)
                    .show();
        } else {
            // 直接发起权限申请(比如用户第一次打开应用,或之前勾选了"不再询问")
            ActivityCompat.requestPermissions(
                    this,
                    pendingPermissions.toArray(new String[0]),
                    REQUEST_SMS_CONTACTS_PERMISSIONS
            );
        }
    } else {
        // 所有权限都已授予,执行需要权限的业务逻辑
        executePermissionDependentTasks();
    }
}

3. 处理权限申请回调

重写onRequestPermissionsResult方法,处理用户授权后的结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_SMS_CONTACTS_PERMISSIONS) {
        // 检查所有申请的权限是否都被授予
        boolean allGranted = true;
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                allGranted = false;
                break;
            }
        }

        if (allGranted) {
            // 权限全部通过,执行业务逻辑
            executePermissionDependentTasks();
        } else {
            // 有至少一个权限被拒绝,提示用户前往设置开启
            new AlertDialog.Builder(this)
                    .setTitle("权限被拒绝")
                    .setMessage("部分权限被拒绝会导致功能无法正常使用,您可以前往应用设置手动开启权限。")
                    .setPositiveButton("去设置", (dialog, which) -> {
                        Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri appUri = Uri.fromParts("package", getPackageName(), null);
                        settingsIntent.setData(appUri);
                        startActivity(settingsIntent);
                    })
                    .setNegativeButton("取消", null)
                    .show();
        }
    }
}

4. 业务逻辑封装方法

写一个方法来封装需要权限才能执行的操作,比如发送短信、读取联系人:

private void executePermissionDependentTasks() {
    // 这里替换成你实际需要执行的代码,例如:
    // 1. 发送短信的逻辑
    // 2. 查询联系人列表的逻辑
    Toast.makeText(this, "权限已全部授予,可以开始操作啦!", Toast.LENGTH_SHORT).show();
}

5. 触发权限检查

最后,在合适的时机调用checkAndRequestPermissions(),比如在onCreate方法里:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 启动应用时检查并申请权限
    checkAndRequestPermissions();
}

这个方案兼顾了权限检查、用户友好提示和回调处理,逻辑清晰,直接就能复用。

内容的提问来源于stack exchange,提问作者João Vieira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:13