Android极速开发之发送短信

作者: Javen205 | 来源:发表于2016-09-03 17:50 被阅读2002次

    欢迎留言、转发、打赏

    项目源码参考地址 点我点我--欢迎Start

    1、调用系统已有程序发短信功能

        /**
         * @param phoneNumber
         * @param message
         */
        public void doSendSMSTo(String phoneNumber,String message){
            if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
                Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));          
                intent.putExtra("sms_body", message);          
                startActivity(intent);
            }
        }
    

    2、调用API来实现发送短信

    SMS涉及的主要类SmsManager

    实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。

    公有方法:

    • ArrayList<String> divideMessage(String text)

      当短信超过SMS消息的最大长度时,将短信分割为几块。
      参数:text——初始的消息,不能为空
      返回值:有序的ArrayList<String>,可以重新组合为初始的消息

    • static SmsManager getDefault()

      获取SmsManager的默认实例。
      返回值:SmsManager的默认实例

    • void SendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data,PendingIntent sentIntent, PendingIntent deliveryIntent)

      发送一个基于SMS的数据到指定的应用程序端口。
      参数:
      1)、destinationAddress——消息的目标地址
      2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
      3)、destinationPort——消息的目标端口号
      4)、data——消息的主体,即消息要发送的数据
      5)、sentIntent——如果不为空,当消息成功发送或失败这个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。
      6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个PendingIntent就广播。

    异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。

    • void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts,ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliverIntents)

      发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。
      参数:
      1)、destinationAddress——消息的目标地址
      2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
      3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息
      4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
      5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent

    异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。

    • void** sendTextMessage**(String destinationAddress, String scAddress, String text, PendingIntent sentIntent,PendingIntent deliveryIntent)

      发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。

    代码封装如下

    SMSMethod 发送短信的单例

    public class SMSMethod {
        private static  SMSMethod mSMSmsMethod;
        /* 自定义ACTION常数,作为广播的Intent Filter识别常数 */
        public static String SMS_SEND_ACTIOIN = "SMS_SEND_ACTIOIN";
        public static String SMS_DELIVERED_ACTION = "SMS_DELIVERED_ACTION";
    
        /* 建立两个mServiceReceiver对象,作为类成员变量 */
        private SMSReceiver mSendSMSReceiver, mDeliveredSMSReceiver;
        
        private Context mContext;
    
        private SMSMethod(Context context){
            mContext=context;
            registerReceiver();
        }
    
        public static  SMSMethod getInstance(Context context){
            if (mSMSmsMethod==null){
                synchronized (SMSMethod.class){
                    if (mSMSmsMethod==null){
                        mSMSmsMethod=new SMSMethod(context);
                    }
                }
            }
            return  mSMSmsMethod;
        }
    
        /**
         * 注册
         */
        public void registerReceiver(){
             /* 自定义IntentFilter为SENT_SMS_ACTIOIN Receiver */
            IntentFilter mFilter01;
            mFilter01 = new IntentFilter(SMS_SEND_ACTIOIN);
            mSendSMSReceiver = new SMSReceiver();
            mContext.registerReceiver(mSendSMSReceiver, mFilter01);
    
            /* 自定义IntentFilter为DELIVERED_SMS_ACTION Receiver */
            mFilter01 = new IntentFilter(SMS_DELIVERED_ACTION);
            mDeliveredSMSReceiver = new SMSReceiver();
            mContext.registerReceiver(mDeliveredSMSReceiver, mFilter01);
        }
    
        public void unregisterReceiver(){
            /* 取消注册自定义Receiver */
            if (mSendSMSReceiver!=null){
                mContext.unregisterReceiver(mSendSMSReceiver);
            }
            if (mDeliveredSMSReceiver!=null) {
                mContext.unregisterReceiver(mDeliveredSMSReceiver);
            }
        }
    
        public void SendMessage(String strDestAddress,String strMessage){
            /* 建立SmsManager对象 */
            SmsManager smsManager = SmsManager.getDefault();
            try {
              /* 建立自定义Action常数的Intent(给PendingIntent参数之用) */
                Intent itSend = new Intent(SMS_SEND_ACTIOIN);
                Intent itDeliver = new Intent(SMS_DELIVERED_ACTION);
    
              /* sentIntent参数为传送后接受的广播信息PendingIntent */
                PendingIntent mSendPI = PendingIntent.getBroadcast(mContext, 0, itSend, 0);
    
              /* deliveryIntent参数为送达后接受的广播信息PendingIntent */
                PendingIntent mDeliverPI = PendingIntent.getBroadcast(mContext, 0, itDeliver, 0);
                List<String> divideContents = smsManager.divideMessage(strMessage);
                for (String text:divideContents) {
                     /* 发送SMS短信,注意倒数的两个PendingIntent参数 */
                    smsManager.sendTextMessage(strDestAddress, null, text, mSendPI, mDeliverPI);
                }
    
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
        public void SendMessage2(String strDestAddress,String strMessage){
            ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>();
            ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>();
    
    
            /* 建立SmsManager对象 */
            SmsManager smsManager = SmsManager.getDefault();
            try {
              /* 建立自定义Action常数的Intent(给PendingIntent参数之用) */
                Intent itSend = new Intent(SMS_SEND_ACTIOIN);
                Intent itDeliver = new Intent(SMS_DELIVERED_ACTION);
    
              /* sentIntent参数为传送后接受的广播信息PendingIntent */
                PendingIntent mSendPI = PendingIntent.getBroadcast(mContext, 0, itSend, 0);
    
              /* deliveryIntent参数为送达后接受的广播信息PendingIntent */
                PendingIntent mDeliverPI = PendingIntent.getBroadcast(mContext, 0, itDeliver, 0);
                ArrayList<String> mSMSMessage = smsManager.divideMessage(strMessage);
    
                for (int i = 0; i < mSMSMessage.size(); i++) {
                    sentPendingIntents.add(i, mSendPI);
                    deliveredPendingIntents.add(i, mDeliverPI);
                }
                 /* 发送SMS短信,注意倒数的两个PendingIntent参数 */
                smsManager.sendMultipartTextMessage(strDestAddress,null,mSMSMessage ,sentPendingIntents,deliveredPendingIntents);
    
    
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    短信发送状态监听

    public class SMSReceiver extends BroadcastReceiver{
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(SMSMethod.SMS_SEND_ACTIOIN)){
                try{
                    /* android.content.BroadcastReceiver.getResultCode()方法 */
                    //Retrieve the current result code, as set by the previous receiver.
                    switch (getResultCode()){
                        case Activity.RESULT_OK:
                            Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
                            break;
                        case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                            Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show();
                            break;
                        case SmsManager.RESULT_ERROR_RADIO_OFF:
                            break;
                        case SmsManager.RESULT_ERROR_NULL_PDU:
                            break;
                    }
                }catch (Exception e){
    
                }
            } else if(intent.getAction().equals(SMSMethod.SMS_DELIVERED_ACTION)){
                /* android.content.BroadcastReceiver.getResultCode()方法 */
                switch(getResultCode()){
                    case Activity.RESULT_OK:
                        Toast.makeText(context, "短信已送达", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        /* 短信未送达 */
                        Toast.makeText(context, "短信未送达", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        break;
                }
            }
        }
    }
    
    

    在AndroidManifest.xml中添加监听

    <!-- 短信发送送达--><receiver android:name=".sms.SMSReceiver"/>
    
    • 一些例子
     public void sendTextMessage(View view){
            SMSMethod.getInstance(this).SendMessage("这里填写手机号码","测试短信.....Javen");
        }
        public void sendMultipartTextMessage(View view){
            SMSMethod.getInstance(this).SendMessage2("这里填写手机号码", "测试短信......Javen");
        }
    
        @Override
        protected void onPause() {
            SMSMethod.getInstance(this).unregisterReceiver();
            super.onPause();
        }
    
    

    添加发送短信的权限

    <uses-permission android:name="android.permission.SEND_SMS" />
    

    项目源码参考地址 点我点我--欢迎Start

    相关文章

      网友评论

      • taoza:6.0 之后好像 SMS Manager 不能用了?如何处理呢?谢谢。
        Javen205:我看官方的API 7.0也有SMS Manager呀.
        https://developer.android.com/reference/android/telephony/SmsManager.html

      本文标题:Android极速开发之发送短信

      本文链接:https://www.haomeiwen.com/subject/msakettx.html