安卓学习之接收发送短信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓学习之接收发送短信相关的知识,希望对你有一定的参考价值。

短信接收

android中当手机接收到一条短信后,会发送android.provider.Telephony.SMS_RECEIVED 的广播,这条广播中携带有与短信相关的所有数据。每个应用程序都可以在广播接收器里对他监听。

简单的短信接收程序:

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);

        //设置过滤器
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");

        //获取MessageReceiver实例
        messageReceiver = new MessageReceiver();

        //注册广播
        registerReceiver(messageReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(messageReceiver);
    }

    //接收短信广播接收器
    class MessageReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            //使用 pdu 密钥来提取一个 SMS pdus 数组 ,其中每一个 pdu 都表示一条短信消息
            Object[] smsPdus = (Object[]) intent.getExtras().get("pdus");

            //用来储存消息
            SmsMessage[] smsMessage = new SmsMessage[smsPdus.length];

            /**
             * SmsMessage.createFromPdu((byte[]) smsPdus[i], format);
             * 第二个参数应该是短信的类型, GSM与CDMA短信的解码方式不同,所以应该传入这个参数
             * */
            String format = intent.getStringExtra("format");

            //将每一个 pdu 格式数组转换为 SmsMessage 对象
            for(int i = 0; i < smsMessage.length; i++){
                if(Build.VERSION.SDK_INT < 23) {
                    smsMessage[i] = SmsMessage.createFromPdu((byte[]) smsPdus[i]);
                } else {
                    smsMessage[i] = SmsMessage.createFromPdu((byte[]) smsPdus[i], format);
                }
            }

            //获取发送的号码
            String address = smsMessage[0].getOriginatingAddress();

            //将多段内容链接起来
            StringBuilder messageContent = new StringBuilder();
            for(SmsMessage message : smsMessage){
                messageContent.append(message.getMessageBody());
            }

            //设置视图内容
            sender.setText(address);
            content.setText(messageContent.toString());
        }
    }

 

在AndroidManifest.xml中添加

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

 

 

  由于收到短信系统会发送一条广播,那我们应该去监听这条广播,获取短信内容。 所以先要新建一个广播接收器类 MessageReceiver 继承自 Broadcast 。重写onReceiver()方法。

主要步骤:

   1.Intent.getExtras()方法获取一个Bundle对象,Bundle.get("pdus"); 获取短信内容; pdus是一个object类型的数组,每一个object都是一个byte[]字节数组,每一项为一条短信。

   2.将字节数组封装成SmsMessage类型,在android API 23以后 SmsMessage.createFromPdu((byte[]) ); 不在推荐使用,替代的是 SmsMessage.createFromPdu((byte[]) , format); 第二个参数代表手机制式;可以使用 intent.getStringExtra("format"); 获得。

   3.SmsMessage对象的getMessageBody()方法可以获得短信内容。getOriginatingAddress()可以获得发送方的号码。

 

  所以一旦接收到短信,系统发送 android.provider.Telephony.SMS_RECEIVED 广播,就会被动态注册的接收器接收,然后就会调用MessageReceiver的onReceiver()方法。

 

短信截断

  在android 4.4以后abortBroadcast()不能截断短信。

短信发送

  SmsManager对象有发送短信功能,可以调用SmsManager.getDefault()方法获取。

  SmsManager.sendTextMessage()方法有5个参数,第一个参数是目标号码,第三个参数是短信内容,第四个参数是一个PendingIntent对象。

  PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,Intent,0);该方法可以获取一个PendingIntent对象。

  现在来看一个例子:

SmsManager smsManager = SmsManager.getDefault();
Intent sendIntent = new Intent();
sendIntent.setAction("SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,sendIntent,0);

//发送短信
/* sendTextMessage方法有5个参数,第一个参数指指定接收人的号码,第三个指定内容 */ smsManager.sendTextMessage(to.getText().toString(),null,msgInput.getText().toString(),pi,null);

 

这里表示当发送短信时,我们自己写了一条广播,发出一条为 SENT_SMS_ACTION 的广播,由于在虚拟机上操作,我们可以来通过监听这个广播来观察短信发送是否成功。

 

 

到这里学习了基本的短信接收和发送功能。

 

以上是关于安卓学习之接收发送短信的主要内容,如果未能解决你的问题,请参考以下文章

安卓学习之通知(Notification)

如何添加短信发送和接收呼叫lomgs

安卓手机只能接受短信不能发送短信怎么办?

Android学习之系统框架

Android学习之基础知识八—Android广播机制

安卓学习之FrameLayout