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

安卓开发 发送短信

安卓开发发送短信实现指南


基础权限配置

配置项 说明
<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();

注意事项

  1. Android 10+ 限制:需将应用设为默认短信应用(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT
  2. 运营商限制:部分手机可能拦截营销类短信内容
  3. 双卡设备:需指定 subId 或使用 SubscriptionManager 获取卡槽信息

常见问题与解答

Q1:运行时提示 “未获得发送短信权限” 怎么办?
A1:需确保完成两步操作:

  1. AndroidManifest.xml 声明权限
    <uses-permission android:name="android.permission.SEND_SMS"/>
  2. 在代码中动态申请权限(Android 6.0+)
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE);

Q2:发送短信后无响应,如何排查问题?
A2:按以下顺序检查:
| 检查项 | 解决方法 |
|——–|———-|
| 设备网络 | 确保手机信号正常,非飞行模式 |
| 号码格式 | 检查是否包含国际区号(如 +86) |
| 权限状态 | 确认已动态获取 SEND_SMS 权限 |
| 默认应用 | Android 10+ 需设置为默认短信应用 |
| 运营商限制 | 尝试发送不同内容(如纯文字)

0