短信的收发及在android模拟器之间实践(2)

系统 2152 0

3.1、运行SMS程序给另一个android模拟器发短信

运行上面我们编写的TextMessage程序,另外在Windows的命令行下切换到tools目录下,并输入emulator –data smsReceiver,我的如下:

image

这样就会启动一个android模拟器,如下所示:( 注意它的编号:5556,就是用这个编号与它通信的

image

图2、通过emulator启动一个android模拟器

通过我们TextMessage程序启动的android模拟器,编写短信:

image

图3、TextMessage程序个5556模拟器发短信

点击发送之后,通过命令行启动的5556号android模拟器会收到我们刚才发送的短信,如下所示:

image

图4、收到短信的提示

tips:

如果通过命令行的emulator启动android模拟器提示“NO DNS servers found!”,这时我们发的短信模拟器是收不到的。

  • 在Windows下,如果电脑没有介入网络,即找不DNS服务器的话会出现这种情况!
  • 在Mac下,如果提示这个警告的话,可以这样解决:检查你是否有 /etc/resolv.conf 文件,如果没有的话,通过下面的命令行
            ln -s /private/var/run/resolv.conf /etc/resolv.conf可以解决。
          

4、SMS增强(一)

上面我们实现了一个简单的SMS程序,下面我们要对它进行增强!你肯定已经注意到了,我们上面的SMS程序的sendTextMessage方法中的第4个和第5个参数PendingIntent设为null,即sentIntent和deliveryIntent。

第4个参数-sendIntent,当消息成功发送或发送失败都将被触发。广播接收者的结果码,Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。对应RESULT_ERROR_GENERIC_FAILURE, sentIntent 可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。第5个参数-deliveryIntent,仅当目标接收到你的SMS消息才触发。

为了跟踪发出的短信的状态,实现和注册Broadcast Receiver(广播接收者)监听传递给sendTextMessage方法的参数Pending Intents。下面我们就实现和注册这个广播接收者:

      String SENT_SMS_ACTION="
      
        SENT_SMS_ACTION
      
      ";
String DELIVERED_SMS_ACTION="
      
        DELIVERED_SMS_ACTION
      
      ";


      
        //create the sentIntent parameter
      
      
Intent sentIntent=
      
        new
      
       Intent(SENT_SMS_ACTION);
PendingIntent sentPI=PendingIntent.getBroadcast(
  
      
        this
      
      ,
  0, 
  sentIntent, 
  0);


      
        //create the deilverIntent parameter
      
      
Intent deliverIntent=
      
        new
      
       Intent(DELIVERED_SMS_ACTION);
PendingIntent deliverPI=PendingIntent.getBroadcast(
  
      
        this
      
      ,
  0, 
  deliverIntent, 
  0);


      
        //register the Broadcast Receivers
      
      
registerReceiver(
      
        new
      
       BroadcastReceiver(){
 @Override
 
      
        public
      
      
        void
      
       onReceive(Context _context,Intent _intent)
 {
  
      
        switch
      
      (getResultCode()){
   
      
        case
      
       Activity.RESULT_OK:
    Toast.makeText(getBaseContext(), 
      "
      
        SMS sent success actions
      
      ",
                        Toast.LENGTH_SHORT).show();
    
      
        break
      
      ;
   
      
        case
      
       SmsManager.RESULT_ERROR_GENERIC_FAILURE:
    Toast.makeText(getBaseContext(), 
      "
      
        SMS generic failure actions
      
      ",
                        Toast.LENGTH_SHORT).show();
    
      
        break
      
      ;
   
      
        case
      
       SmsManager.RESULT_ERROR_RADIO_OFF:
    Toast.makeText(getBaseContext(),
      "
      
        SMS radio off failure actions
      
      ",
                        Toast.LENGTH_SHORT).show();
    
      
        break
      
      ;
   
      
        case
      
       SmsManager.RESULT_ERROR_NULL_PDU:
    Toast.makeText(getBaseContext(), 
      "
      
        SMS null PDU failure actions
      
      ",
                        Toast.LENGTH_SHORT).show();
    
      
        break
      
      ;
  }
 }
},

      
        new
      
       IntentFilter(SENT_SMS_ACTION));
registerReceiver(
      
        new
      
       BroadcastReceiver(){
 @Override
 
      
        public
      
      
        void
      
       onReceive(Context _context,Intent _intent)
 {
  Toast.makeText(getBaseContext(), 
    "
      
        SMS delivered actions
      
      ",
                Toast.LENGTH_SHORT).show();    
 }
},

      
        new
      
       IntentFilter(DELIVERED_SMS_ACTION));

    

 

在基本完成了要做的工作,接下来要做的就是将sendTextMessage的第4个和第5个参数改为sentPI、deliverPI,这样工作基本完成,修改后的sendSMS方法如下:

      
      
        
          private
        
        
          void
        
         sendSMS(String phoneNumber, String message) {
 
        
          // ---sends an SMS message to another device---
        
        
 SmsManager sms = SmsManager.getDefault();
 String SENT_SMS_ACTION = "
        
          SENT_SMS_ACTION
        
        ";
 String DELIVERED_SMS_ACTION = "
        
          DELIVERED_SMS_ACTION
        
        ";

 
        
          // create the sentIntent parameter
        
        
 Intent sentIntent = 
        
          new
        
         Intent(SENT_SMS_ACTION);
 PendingIntent sentPI = PendingIntent.getBroadcast(
        
          this
        
        , 0, sentIntent,
   0);

 
        
          // create the deilverIntent parameter
        
        
 Intent deliverIntent = 
        
          new
        
         Intent(DELIVERED_SMS_ACTION);
 PendingIntent deliverPI = PendingIntent.getBroadcast(
        
          this
        
        , 0,
   deliverIntent, 0);

 
        
          // register the Broadcast Receivers
        
        
 registerReceiver(
        
          new
        
         BroadcastReceiver() {
  @Override
  
        
          public
        
        
          void
        
         onReceive(Context _context, Intent _intent) {
   
        
          switch
        
         (getResultCode()) {
   
        
          case
        
         Activity.RESULT_OK:
    Toast.makeText(getBaseContext(),
      "
        
          SMS sent success actions
        
        ", Toast.LENGTH_SHORT)
      .show();
    
        
          break
        
        ;
   
        
          case
        
         SmsManager.RESULT_ERROR_GENERIC_FAILURE:
    Toast.makeText(getBaseContext(),
      "
        
          SMS generic failure actions
        
        ", Toast.LENGTH_SHORT)
      .show();
    
        
          break
        
        ;
   
        
          case
        
         SmsManager.RESULT_ERROR_RADIO_OFF:
    Toast
      .makeText(getBaseContext(),
        "
        
          SMS radio off failure actions
        
        ",
        Toast.LENGTH_SHORT).show();
    
        
          break
        
        ;
   
        
          case
        
         SmsManager.RESULT_ERROR_NULL_PDU:
    Toast.makeText(getBaseContext(),
      "
        
          SMS null PDU failure actions
        
        ", Toast.LENGTH_SHORT)
      .show();
    
        
          break
        
        ;
   }
  }
 }, 
        
          new
        
         IntentFilter(SENT_SMS_ACTION));
 registerReceiver(
        
          new
        
         BroadcastReceiver() {
  @Override
  
        
          public
        
        
          void
        
         onReceive(Context _context, Intent _intent) {
   Toast.makeText(getBaseContext(), "
        
          SMS delivered actions
        
        ",
     Toast.LENGTH_SHORT).show();
  }
 }, 
        
          new
        
         IntentFilter(DELIVERED_SMS_ACTION));

 
        
          // if message's length more than 70 ,
        
        
          // then call divideMessage to dive message into several part ,and call
        
        
          // sendTextMessage()
        
        
          // else direct call sendTextMessage()
        
        
          if
        
         (message.length() > 70) {
  ArrayList<String> msgs = sms.divideMessage(message);
  
        
          for
        
         (String msg : msgs) {
   sms.sendTextMessage(phoneNumber, 
        
          null
        
        , msg, sentPI, deliverPI);
  }
 } 
        
          else
        
         {
  sms.sendTextMessage(phoneNumber, 
        
          null
        
        , message, sentPI, deliverPI);
 }
}

      
    

 

运行之后的,发送短信成功的话就可以看到如下界面:

sms

图5、增强SMS(一)

5、SMS增强(二)

下面这个增强是使SMS能够发送二进制数据。要发送数据要使用SmsManager类的sendDataMessage方法,跟sendTextMessage方法类似,只不过该方法多了一个目标端口的参数,构建该SMS的过程跟前面的类似这里就不在累述。

短信的收发及在android模拟器之间实践(2)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论