先来学习一下收短信。
收短信用到了我们之前学过的内容--广播机制。当手机收到一条短信时,会发送出一条值为“android.provider.Telephony.SMS_RECEIVED”的广播,这条广播里携带着与短信相关的所有数据。我们可以利用广播接收器将这条广播监听截取到,然后对这个内容进行解析(记住还要把广播截断,让系统本身收不到)。这样就完成了一个简单的短信接收。
1.写一个简单的布局
2.写好接收器,在onReceive()中做好短信内容的获取以及电话信息的获取。
3.在MainActivity中注册以及销毁
我们直接看2吧,在这里要做
public class MessageReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("puds"); //提取短信消息
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0;ilength;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
String address = messages[0].getOriginatingAddress();//获取发送方号码
String fullMessage = "";
for (SmsMessage message : messages){
fullMessage += message.getMessageBody();//获取短信内容
}
sender.setText(address);
content.setText(fullMessage);
}
}
从Intent中取出Bundle对象,使用puds秘钥来提取一个SMS pdus数组,其中每一个pdu都表示一条短信消息。接着使用SmsMessage的createFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象。调用这个对象的getOriginatingAddress()方法就可以获取到短信的发送方号码,调用getMessageBody()方法就获取到短信的内容,拼起来就是完整的短信了。记得把他们放到界面的控件上去。
在MainActivity中要做的注册活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main);
sender = (TextView) findViewById(R.id.
sender);
content = (TextView) findViewById(R.id.
content);
receiverFilter =
new IntentFilter();
receiverFilter.addAction(
"android.provider.Telephony.SMS_RECEIVED");
messageReceiver =
new MessageReceiver();
registerReceiver(messageReceiver,receiverFilter);
}
这样就完成了一个简单的短信接收功能,还要记得注销操作,如果要做到短信的拦截记得设置高接收器的优先级,加上截断代码abortBroadcast(),还有就是权限的问题。
收短信权限:
<
uses-permission
android
:name=
"android.permission.RECEIVE_SMS"/>
要想测试一下我们可以使用DDMS下的Emulator Control切换卡,可以给虚拟机做短信测试用(环境自带的虚拟机可用,Genymotion有些问题,没查出来,使用环境自带的先)
然后我们就可以考虑一下发短信了。
发短信其实是用到了SmsManager的一个sendTextMessage()这样的方法,就这么简单。
还是先来说明一下要做的工作
1.写一个布局(每次都特别简单就不写了)
2.拿到SmsManager的实例,调用sendTextMessage()方法
在正式写之前我们应该学会sendTextMessage()方法的参数
public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
destinationAddress |
发送短信的地址(也就是号码) |
scAddress |
短信服务中心,如果为null,就是用当前默认的短信服务中心 |
text |
短信内容 |
sentIntent |
如果不为null,当短信发送成功或者失败时,这个PendingIntent会被广播出去成功的结果代码是Activity.RESULT_OK,或者下面这些错误之一 :RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_RADIO_OFF
RESULT_ERROR_NULL_PDU 对于 RESULT_ERROR_GENERIC_FAILURE, the这个sentIntent可能包括额外的"errorCode",包含一些具体有用的信息帮助检查 。基于SMS控制的全部程序检查 sentIntent. 如果 sentIntent 为空,the caller will be checked against all unknown applications, which cause smaller number of SMS to be sent in checking period. |
deliveryIntent |
如果不为null,当这个短信发送到接收者那里,这个PendtingIntent会被广播,状态报告生成的pdu(指对等层次之间传递的数据单位)会拓展到数据("pdu")
|
后两个参数的目的相信大家已经明确了,如果要用到就当然需要接收器了,(这里我写了一个根据第四个参数来进行相应动作的接收器)
在MainActivity中onCreate()写的代码
to = (EditText) findViewById(R.id.
To);
msgInput = (EditText) findViewById(R.id.
msg_input);
send = (Button) findViewById(R.id.
send);
sendFilter =
new IntentFilter();
sendFilter.addAction(
"SENT_SMS_ACTION");
sendStatusReceiver =
new SendStatusReceiver();
registerReceiver(
sendStatusReceiver,
sendFilter);
send.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
SmsManager smsManager = SmsManager.
getDefault();
Intent sentIntent =
new Intent(
"SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.
getBroadcast(MainActivity.
this,
0,sentIntent,
0);
smsManager.sendTextMessage(
to.getText().toString(),
null,
msgInput.getText().toString(), pi,
null);
}
});
收到广播相应的动作如下
public class SendStatusReceiver
extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode() ==
RESULT_OK){
Toast.
makeText(context,
"Send succeeded",Toast.
LENGTH_LONG).show();
}
else {
Toast.
makeText(context,
"Send failed",Toast.
LENGTH_LONG).show();
}
}
}
这样就完成了。很简单对不对。
别忘了权限
<
uses-permission
android
:name=
"android.permission.SEND_SMS" />