当前位置:首页 > 行业动态 > 正文

安卓发送短信代码权限

安卓发送短信需声明 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);
}

注意事项

  1. 运行时权限:未动态申请权限会导致 SecurityException
  2. 真机测试:模拟器可能无法发送真实短信,建议使用真机调试。
  3. 长度:单条短信最多 160 字符(中文70字符),超长需分割。
  4. 隐私合规:需确保用户同意发送短信,遵守当地法律法规。

相关问题与解答

问题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);
        }
    }
}