8.2接收和发送条短信

来源:互联网 发布:mac ppt使用教程 编辑:程序博客网 时间:2024/05/22 00:05

8.2.1接收短信

当手机接收到一条短信的时候,系统会发出一值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带者与短信相关的所有数据。每个程序都可以在广播接收器里对他进行监听,收到广播时再从中解析出短信的内容即可。

举例说明:

  1. 新建SMStest项目,首先修改activity_main.xml中的代码.
    在这个布局文件里,根元素下放置了两个LinearLayout,用于显示两个行数据。第一个LinearLayout中有两个TextView,用于显示短信的发送方。第二个Linear Layout中也有两个TextView,用于显示短信的内容。

  2. 修改MainActivity中的代码,在onCreate()方法中获取两个TextView的实例。

  3. 创建广播接收器
    创建一个广播接收器来接收系统发出的广播。在MainActivity中新建MessageReceiver内部类继承自BroadcastReceiver,并在onReceive()方法中编写获取短信数据的逻辑。

    class MessageReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Bundle bundle = intent.getExtras();            Object[] pdus = (Object[]) bundle.get("pdus"); //提取短信消息            String format = intent.getStringExtra("format");            SmsMessage[] messages = new SmsMessage[pdus.length];            for (int i = 0; i < messages.length; i++) {                byte[] sms = (byte[])pdus[i];                messages[i] = SmsMessage.createFromPdu(sms, format);            }            String address = messages[0].getOriginatingAddress(); //获取发送方号码            String fullMessage = "";            for (SmsMessage message : messages) {                fullMessage += message.getMessageBody(); //获取短信内容            }            sender.setText(address);            content.setText(fullMessage);        }    }

以上代码,首先从Intent参数中取出了一个Bundle对象,然后使用pdu密钥来提取一个SMS pdus 数组,其中每一个pdu都表示一条短信消息。接着使用SmsMessagecreateFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象,调用这个对象的getOriginatingAdress()方法就可以获取到发送方的号码,调用getMessageBody()方法就可以获取到短信的内容,然后将每一个SmsMessage对象中的内容拼接起来,就组成了一条完整的短信。最后将将获取到的发送方号码和短信内容在TextView中显示出来。
完成了MessageReceiver之后,还需要对他进行注册才能接收短信广播。这里使用动态注册广播的技术。即首先在onCreate()方法中对MessageReceiver进行注册,然后在onDestroy()方法中再对其取消注册。
最后在AndroidManifest.xml中给程序声明一个接收短信的权限:

<uses-permission android:name = "android.permission.RECEIVE_SMS" />

8.2.2发送短信

  1. 在原项目的基础上,新增两个LinearLayout,分别处于第三、四行的位置。第三行放置了一个EditText,用于输入接收方的号码。第四行设置了一个EditText和一个Button分别用于输入短信内容和发送短信。

  2. 然后修改MainActivity中的代码,加入发送短信的处理逻辑:

    ......    private EditText to;    private EditText msgInput;    private Button send;    ......        to = (EditText) findViewById(R.id.to);        msgInput = (EditText) findViewById(R.id.msg_input);        send = (Button) findViewById(R.id.send);                send.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SmsManager smsManager = SmsManager.getDefault(); //利用SmsManager的getDefault()方法获取到SmsManager的实例                smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), null);        ......        

以上代码,首先获取了布局文件中新增控件的实例,然后在send按钮的点击事件里面处理了发送短信的具体逻辑。当send按钮被点击时,会先调用SmsManagergetDefault()方法获取到SmsManager的实例,然后再调用它的sendTextMessage()方法就可以去发送短信了。sendTextMessage()方法接受五个参数,第一个参数用于指定接收人的手机号码,第三个参数用于指定短信的内容,其他几个参数暂时用不到,这里直接传入null

3.最后,在AndroidManifest.xml中声明权限:

<uses-permission android:name = "android.permission.SEND_SMS">

4.对短信的发送状态进行监控
利用setTextMessmage()方法的第四个参数对短信的发送状态进行监控,修改MainActivity中的代码:

public class MainActivity extends AppCompatActivity {    **......    private IntentFilter sendFilter;    private SendStatusReceiver sendStatusReceiver;**    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        **......        sendFilter = new IntentFilter();        sendFilter.addAction("SENT_SMS_ACTION");        sendStatusReceiver = new SendStatusReceiver();        registerReceiver(sendStatusReceiver, sendFilter);**        send.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SmsManager smsManager = SmsManager.getDefault(); //利用SmsManager的getDefault()方法获取到SmsManager的实例                **Intent sendIntent = new Intent("SEND_SMS_ACTION");                PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, sendIntent, 0);                smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null);**            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(messageReceiver);        **unregisterReceiver(sendStatusReceiver);**    }     **......    class SendStatusReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            if (getResultCode() == RESULT_OK) {                //短信发送成功                Toast.makeText(context, "发送成功", Toast.LENGTH_LONG).show();            } else {                //短信发送失败                Toast.makeText(context, "发送失败", Toast.LENGTH_LONG).show();            }        }    }**}

可以看到,在Send按钮的点击事件里调用了PendingIntentgetBroadcast()方法获取到了一个PendingIntent对象,并将它作为第四个参数传到SendTextMessage()方法中。然后又注册了一个新的广播接收器SendStatusReceiver,这个广播接收器就是专门用于坚挺短信发送状态的,当getResultCode()的值为RESULT_OK就会提示发送成功,否则提示发送失败。

0 0
原创粉丝点击