上一篇
安卓发送短信代码权限
- 行业动态
- 2025-04-22
- 5
安卓发送短信需声明
SEND_SMS
权限,Android 6.0+需动态申请,涉及隐私操作需谨慎处理,避免滥用
权限
安卓发送短信代码权限与实现
权限配置
在安卓应用中发送短信需要以下权限:
权限名称 | 作用 | 适用场景 |
---|---|---|
SEND_SMS |
允许应用发送短信 | 发送短信时必须声明 |
READ_PHONE_STATE |
读取手机状态(可选) | 部分设备可能需要 |
RECEIVE_SMS (可选) |
接收短信(若需监听) | 广播接收器场景 |
注意:
- 从 Android 6.0 (API 23) 开始,
SEND_SMS
是危险权限,需在运行时动态申请。 - 清单文件(
AndroidManifest.xml
)中仍需声明权限,但仅声明不会自动授权。
代码实现步骤
清单文件声明权限
<manifest> <uses-permission android:name="android.permission.SEND_SMS" /> <!-可选权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> </manifest>
动态申请权限(Android 6.0+)
// 检查是否已授予权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { // 请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SEND_SMS_CODE); } else { // 已有权限,直接发送短信 sendSMS("123456789", "Test message"); } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_SEND_SMS_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限被授予,发送短信 sendSMS("123456789", "Test message"); } else { // 权限被拒绝,提示用户 Toast.makeText(this, "无发送短信权限", Toast.LENGTH_SHORT).show(); } } }
发送短信的核心代码
private void sendSMS(String phoneNumber, String message) { // 创建短信管理器 SmsManager smsManager = SmsManager.getDefault(); // 拆分长短信(可选) ArrayList<String> messageParts = smsManager.divideMessage(message); // 发送短信(需处理回调) smsManager.sendMultipartTextMessage(phoneNumber, null, messageParts, null, null); }
注意事项
- 运行时权限:未动态申请权限会导致
SecurityException
。 - 真机测试:模拟器可能无法发送真实短信,建议使用真机调试。
- 长度:单条短信最多 160 字符(中文70字符),超长需分割。
- 隐私合规:需确保用户同意发送短信,遵守当地法律法规。
相关问题与解答
问题1:如何监听短信发送结果?
解答:
可通过 PendingIntent
获取发送状态。
// 创建用于接收状态的 PendingIntent PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT_ACTION"), PendingIntent.FLAG_UPDATE_CURRENT); // 注册广播接收器 registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if ("SMS_SENT_ACTION".equals(intent.getAction())) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show(); break; } } } }, new IntentFilter("SMS_SENT_ACTION")); // 发送短信时传入 sentIntent smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, null);
问题2:如果用户拒绝授予 SEND_SMS
权限,如何处理?
解答:
应提供友好的提示,并禁用相关功能。
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_SEND_SMS_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予,启用发送按钮 sendButton.setEnabled(true); } else { // 权限拒绝,提示并禁用功能 Toast.makeText(this, "需要短信权限才能发送", Toast.LENGTH_SHORT).show(); sendButton.setEnabled(false); } } }