android学习笔记——收发短信练习

来源:互联网 发布:淘宝运营怎么做 编辑:程序博客网 时间:2024/05/16 09:13
先来学习一下收短信。
收短信用到了我们之前学过的内容--广播机制。当手机收到一条短信时,会发送出一条值为“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;i<messages.length;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(), nullmsgInput.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" />
0 0