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

安卓发送短信权限代码

安卓发送短信权限代码实现

AndroidManifest.xml 中声明权限

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

动态申请权限(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) {
    // 获取默认订阅卡ID(多卡设备适配)
    int subscriptionId = getDefaultSmsSubscriptionId();
    // 创建 SmsManager 实例
    SmsManager smsManager = SmsManager.getDefault();
    // 拆分长短信(超过160字符自动分割)
    ArrayList<String> messageList = smsManager.divideMessage(message);
    // 发送短信
    for (String msg : messageList) {
        smsManager.sendTextMessage(phoneNumber, null, msg, null, null);
    }
    Toast.makeText(this, "短信发送成功", Toast.LENGTH_SHORT).show();
}
// 获取默认短信卡槽ID(Android 8.0+)
private int getDefaultSmsSubscriptionId() {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        return getDefaultSmsSubscriptionId(); // API 26+ 内置方法
    } else {
        // 手动获取默认卡槽(兼容低版本)
        TelephonyManager telephony = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        return telephony.getDefaultSmsSimId(); // 需添加 READ_PHONE_STATE 权限
    }
}

关键步骤与API对照表

步骤 方法/属性 说明
声明权限 <uses-permission android:name="android.permission.SEND_SMS" /> 在Manifest中声明发送短信权限
检查权限 ContextCompat.checkSelfPermission() 判断是否已获取危险权限
请求权限 ActivityCompat.requestPermissions() 弹出系统权限申请对话框
处理权限结果 onRequestPermissionsResult() 接收用户授权结果
发送短信 SmsManager.sendTextMessage() 调用系统API发送短信
多卡设备适配 getDefaultSmsSubscriptionId() 获取默认短信卡槽ID(Android 8.0+)
长短信拆分 SmsManager.divideMessage() 自动分割超长短信

相关问题与解答

问题1:如果用户拒绝权限,如何引导重新申请?

解答
onRequestPermissionsResult() 的拒绝分支中,可以提示用户手动前往设置页面开启权限:

if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
    Toast.makeText(this, "请前往设置开启发送短信权限", Toast.LENGTH_LONG).show();
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}

问题2:如何支持多SIM卡设备的短信发送?

解答

  1. 通过 TelephonyManager.getSimCount() 判断设备是否为多卡设备。
  2. 使用 SubscriptionManager 获取所有卡槽的订阅信息,允许用户选择发送卡槽。
  3. SmsManager.sendTextMessage() 中指定 subscriptionId 参数。
    // 获取所有卡槽的订阅ID列表
    List<SubscriptionInfo> subs = SubscriptionManager.from(this).getActiveSubscriptionInfoList();
    if (subs != null && subs.size() > 1) {
     // 弹出对话框让用户选择卡槽
     new AlertDialog.Builder(this)
         .setTitle("选择发送卡槽")
         .setItems(tableToDisplayNames(subs), (dialog, which) -> {
             int selectedSubId = subs.get(which).getSubscriptionId();
             sendSMS("123456789", "Test message", selectedSubId);
         }).show();
    }