安卓开发 发送短信
- 行业动态
- 2025-04-22
- 3
安卓开发发送短信实现指南
基础权限配置
配置项 | 说明 |
---|---|
<uses-permission android:name="android.permission.SEND_SMS"/> |
声明发送短信权限(需在AndroidManifest.xml中) |
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> |
可选:读取手机状态(部分场景需要) |
注意:
- Android 6.0+ 需动态申请敏感权限
- Android 10+ 默认禁止第三方应用发送短信,需用户手动设置为默认短信应用
使用 SmsManager 发送短信
// 1. 检查并申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE_SMS); } else { sendSMS("1234567890", "测试短信内容"); } // 2. 发送短信方法 private void sendSMS(String phoneNumber, String message) { SmsManager smsManager = SmsManager.getDefault(); // 长短信分页处理 ArrayList<String> messageParts = smsManager.divideMessage(message); smsManager.sendMultipartTextMessage(phoneNumber, null, messageParts, null, null); } // 3. 权限回调处理 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE_SMS && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { sendSMS("1234567890", "测试短信内容"); } }
通过 Intent 发送短信
// 构造短信Intent Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + Uri.encode("1234567890"))); // 目标号码 intent.putExtra("sms_body", "通过Intent发送的短信"); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }
第三方库方案(如 EasySms)
库名 | 特点 |
---|---|
EasySms | 简化权限校验和发送逻辑,支持回调监听 |
AndroidSms | 提供异步发送接口,兼容低版本安卓 |
示例代码:
EasySms.Builder builder = new EasySms.Builder(this) .setPhoneNumber("1234567890") .setMessage("第三方库发送短信") .setSendListener(new SendListener() { @Override public void onSuccess() { Log.d("SMS", "发送成功"); } @Override public void onFailure(Exception e) { Log.e("SMS", "发送失败: " + e.getMessage()); } }); builder.send();
注意事项
- Android 10+ 限制:需将应用设为默认短信应用(
Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT
) - 运营商限制:部分手机可能拦截营销类短信内容
- 双卡设备:需指定
subId
或使用SubscriptionManager
获取卡槽信息
常见问题与解答
Q1:运行时提示 “未获得发送短信权限” 怎么办?
A1:需确保完成两步操作:
- 在
AndroidManifest.xml
声明权限<uses-permission android:name="android.permission.SEND_SMS"/>
- 在代码中动态申请权限(Android 6.0+)
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE);
Q2:发送短信后无响应,如何排查问题?
A2:按以下顺序检查:
| 检查项 | 解决方法 |
|——–|———-|
| 设备网络 | 确保手机信号正常,非飞行模式 |
| 号码格式 | 检查是否包含国际区号(如 +86
) |
| 权限状态 | 确认已动态获取 SEND_SMS 权限 |
| 默认应用 | Android 10+ 需设置为默认短信应用 |
| 运营商限制 | 尝试发送不同内容(如纯文字)