`
kongweile
  • 浏览: 506852 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

 
阅读更多

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的过程跟前面的类似这里就不在累述。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics