3.1、运行SMS程序给另一个android模拟器发短信
运行上面我们编写的TextMessage程序,另外在Windows的命令行下切换到tools目录下,并输入emulator –data smsReceiver,我的如下:
这样就会启动一个android模拟器,如下所示:( 注意它的编号:5556,就是用这个编号与它通信的 )
图2、通过emulator启动一个android模拟器
通过我们TextMessage程序启动的android模拟器,编写短信:
图3、TextMessage程序个5556模拟器发短信
点击发送之后,通过命令行启动的5556号android模拟器会收到我们刚才发送的短信,如下所示:
图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);
}
}
运行之后的,发送短信成功的话就可以看到如下界面:
图5、增强SMS(一)
5、SMS增强(二)
下面这个增强是使SMS能够发送二进制数据。要发送数据要使用SmsManager类的sendDataMessage方法,跟sendTextMessage方法类似,只不过该方法多了一个目标端口的参数,构建该SMS的过程跟前面的类似这里就不在累述。