SmsManager
直接发送短信SmsManager
是Android提供的用于管理短信发送的工具类,支持直接发送短信到指定号码。
核心步骤:
android.permission.SEND_SMS
SmsManager.getDefault().sendTextMessage()
发送短信代码示例:
// 1. 在AndroidManifest.xml中添加权限 / <uses-permission android:name="android.permission.SEND_SMS"/> / // 2. 检查并申请权限(Android 6.0+) if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, 1); } else { sendSms("1234567890", "Hello World"); } // 3. 发送短信的方法 private void sendSms(String phoneNumber, String message) { SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneNumber, null, message, null, null); } // 4. 处理权限回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { sendSms("1234567890", "Hello World"); } else { Toast.makeText(this, "SMS Permission Denied", Toast.LENGTH_SHORT).show(); } }
此方法无需申请SEND_SMS
权限,但会打开系统短信界面,用户需手动确认发送。
代码示例:
private void sendSmsWithIntent(String phoneNumber, String message) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + phoneNumber)); // 目标手机号 intent.putExtra("sms_body", message); // 短信内容 startActivity(intent); }
特性 | SmsManager 直接发送 |
隐式Intent调用 |
---|---|---|
是否需要权限 | 是(SEND_SMS ) |
否 |
是否需要用户确认 | 否(直接发送) | 是(需手动确认) |
适用场景 | 自动化发送(如验证码) | 用户主动触发发送 |
兼容性 | 需处理权限适配 | 天然兼容所有版本 |
是否需要打开短信应用 | 否 | 是 |
解答:
使用SmsManager.sendTextMessage()
的第四个参数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) { switch(getResultCode()) { case Activity.RESULT_OK: Toast.makeText(context, "SMS Sent Successfully", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(context, "SMS Sending Failed", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter("SMS_SENT_ACTION")); // 发送短信时传入sentIntent smsManager.sendTextMessage(phoneNumber, null, message, sentIntent, null);
SEND_SMS
权限怎么办?解答:
在onRequestPermissionsResult
中处理权限被拒绝的情况,例如提示用户或禁用相关功能:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 1) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { sendSms("1234567890", "Hello World"); } else { Toast.makeText(this, "Without SMS Permission, Function Disabled", Toast.LENGTH_SHORT).show(); // 可选:禁用发送按钮或相关功能 } } }