Android SmsManager 调用接口发短信

Android SmsManager ( 短信管理器 ),见名知意,就是用来管理手机短信的

调用系统提供的短信接口发送短信

  1. 配置发短信的权限

    <uses-permission android:name="android.permission.SEND_SMS"/>
    
  2. 然后直接调用 SmsManager 提供的短信接口发送短信

    sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliverIntent)
    

    参数说明

    参数 说明
    destinationAddress 收信人的电话号码
    scAddress 短信中心的号码,null 的话使用当前默认的短信服务中心
    text 短信内容
    sentIntent 短信发送状态的 Intent(发送状态的 Intent)
    deliverIntent 短信是否被对方收到的状态信息:(接收状态的 Intent ) 如果不为null,当这个短信发送到接收者那里,这个PendtingIntent会被广播,状态报告生成的pdu(指对等层次之间传递的数据单位)会拓展到数据("pdu")

    对于 sentIntent 参数,如果不为 null,当消息成功发送或失败这个PendingIntent 就广播

    结果代码是 Activity.RESULT_OK 表示成功,或 RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误

    对应 RESULT_ERROR_GENERIC_FAILURE,sentIntent 可能包括额外的"错误代码"包含一个无线电广播技术特定的值,通常只在修复故障时有用

    每一个基于SMS的应用程序控制检测 sentIntent

    如果sentIntent是空,调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量的SMS

public void sendSMS(String phoneNumber,String message){  
    //获取短信管理器   
    android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();  
    //拆分短信内容(手机短信长度限制),貌似长度限制为140个字符,就是
    //只能发送70个汉字,多了要拆分成多条短信发送
    //第四五个参数,如果没有需要监听发送状态与接收状态的话可以写null    
    List<String> divideContents = smsManager.divideMessage(message);   
    for (String text : divideContents) {    
        smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);    
    }  
}

可能你还需要监听短信是否发送成功,或者收信人是否接收到信息,可以添加一下代码

  1. 处理返回发送状态的 sentIntent

    //处理返回的发送状态   
    String SENT_SMS_ACTION = "SENT_SMS_ACTION";  
    Intent sentIntent = new Intent(SENT_SMS_ACTION);  
    PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,  0);  
    //注册发送信息的广播接收者
    context.registerReceiver(new BroadcastReceiver() {  
        @Override  
        public void onReceive(Context _context, Intent _intent) {  
            switch (getResultCode()) {  
            case Activity.RESULT_OK:
                Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();  
                break;  
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:    //普通错误
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:         //无线广播被明确地关闭
                break;          
            case SmsManager.RESULT_ERROR_NULL_PDU:          //没有提供pdu
                break;      
            case SmsManager.RESULT_ERROR_NO_SERVICE:         //服务当前不可用
                break;              
            }  
        }  
    }, new IntentFilter(SENT_SMS_ACTION));
    
  2. 处理返回接收状态的 deliverIntent

    //处理返回的接收状态   
    String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";  
    //创建接收返回的接收状态的Intent  
    Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
    PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0);  
    context.registerReceiver(new BroadcastReceiver() {  
       @Override  
       public void onReceive(Context _context, Intent _intent) {  
           Toast.makeText(context,"收信人已经成功接收", Toast.LENGTH_SHORT).show();  
       }  
    }, new IntentFilter(DELIVERED_SMS_ACTION));
    

参考文档

  1. Android SmsManager 官方文档

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.