<uses-permission android:name="android.permission.SEND_SMS" />
// 检查是否已获取发送短信权限 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 权限 } }
步骤 | 方法/属性 | 说明 |
---|---|---|
声明权限 | <uses-permission android:name="android.permission.SEND_SMS" /> | 在Manifest中声明发送短信权限 |
检查权限 | ContextCompat.checkSelfPermission() | 判断是否已获取危险权限 |
请求权限 | ActivityCompat.requestPermissions() | 弹出系统权限申请对话框 |
处理权限结果 | onRequestPermissionsResult() | 接收用户授权结果 |
发送短信 | SmsManager.sendTextMessage() | 调用系统API发送短信 |
多卡设备适配 | getDefaultSmsSubscriptionId() | 获取默认短信卡槽ID(Android 8.0+) |
长短信拆分 | SmsManager.divideMessage() | 自动分割超长短信 |
解答:
在 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); }
解答:
TelephonyManager.getSimCount()
判断设备是否为多卡设备。 SubscriptionManager
获取所有卡槽的订阅信息,允许用户选择发送卡槽。 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(); }