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
相关产品推荐
相关产品推荐

