上一篇
安卓发送短信权限
- 行业动态
- 2025-04-22
- 2755
安卓发送短信权限基础
权限声明
在 AndroidManifest.xml
中声明发送短信权限:
<uses-permission android:name="android.permission.SEND_SM" />
动态权限申请(Android 6.0+)
发送短信属于危险权限,需在运行时动态申请。
申请流程:
- 调用
ActivityCompat.requestPermissions()
发起权限请求。 - 在
onRequestPermissionsResult()
中处理用户响应。
示例代码:
// 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE_SMS); } else { // 已有权限,执行发送短信操作 } // 处理权限结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE_SMS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予,执行发送短信 } else { // 权限被拒绝,提示用户 } } }
发送短信的两种方式
方式 | 说明 | 适用场景 |
---|---|---|
隐式 Intent | 通过 ACTION_SENDTO 或 ACTION_VIEW 触发系统短信应用 | 用户手动确认发送内容 |
SmsManager API | 直接调用系统 API 发送短信,无需用户干预 | 自动化发送(需权限) |
隐式 Intent 发送短信
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + phoneNumber)); // 目标手机号 intent.putExtra("sms_body", "短信内容"); startActivity(intent);
SmsManager 发送短信
SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneNumber, null, messageContent, null, null);
权限被拒绝的常见问题与解决方案
问题 | 解决方案 |
---|---|
用户拒绝权限 | 弹出对话框解释权限用途,引导用户重新授权 |
用户勾选“不再询问” | 跳转至系统设置页,引导用户手动开启权限 |
Android 13+ 限制 | 需在 Manifest 中声明 android:permissionGroup (如 android.permission-group.SMS ) |
跳转设置页代码:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent);
权限相关注意事项
- 权限分组:
SEND_SMS
属于SMS
权限组,申请时需按组处理。 - Android 13+ 新增限制:需在
Manifest
中声明<system-permission name="..." />
(如系统级应用)。 - 隐私政策:申请敏感权限需在隐私政策中明确说明用途。
相关问题与解答
问题1:用户永久拒绝权限后如何恢复?
解答:
无法通过代码强制恢复,需引导用户手动进入设置页开启权限,可提示用户:
- 点击弹窗中的“去设置”按钮。
- 手动找到应用并启用权限。
示例代码参考上方“跳转设置页”。
问题2:如何兼容不同 Android 版本的权限逻辑?
解答:
- Android 6.0+:必须动态申请危险权限。
- Android 13+:需在
Manifest
中声明系统权限(如<system-permission name="android.permission.SEND_SMS" />
)。 - 低版本兼容:通过
Build.VERSION.SDK_INT
判断版本,避免调用高版本特有