Android笔记之(BroadcastReceiver)广播接收短信

来源:互联网 发布:天龙八部抢号软件 编辑:程序博客网 时间:2024/05/16 06:59

今天学会了如何通过Android的广播机制来获取短信通知并得到短信内容,这里主要用到了安卓的广播类BroadcastReceiver

里面的onReceive方法。

首先自定义子类SMSReceiver继承BroadcastReceiver,重写onReceive方法。然后在AndroidManifest.xml或通过代码动态配置

过滤器,当有通过过滤器的广播时,系统会自动new一个子类对象,并调用对象的onReceive方法


注册广播有两种方法,这两种方法的区别是:

AndroidManifest.xml中注册的广播是一直存在的,即使应用程序没有启动,当一有过滤的广播通知,就会创建子类对象并调用onReceive方法。
通过java代码实现的动态注册,可以实现按需监听,并且可以按需注销。主要用在Activity更新中,当Activity不显示时就注销掉,节省系统资源。

AndroidManifest.xml中注册:

<receiver android:name=".TestReceiver">      <intent-filter>          <action android:name="android.provider.Telephony.SMS_RECEIVED"/>     </intent-filter></receiver>

代码实现:

注册绑定对象
private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";//生成一个BroiadcastReceiver对象smsReceiver = new SMSReceiver();//生成IntentFilter对象IntentFilter filter = new IntentFilter();//为IntentFilter添加一个Actionfilter.addAction(SMS_ACTION);//讲BroadcastReceiver对象注册到系统当中TestBC2Activity.this.registerReceiver(smsReceiver,filter);System.out.println("绑定成功");

注销解绑对象
//解除BroadcastReceiver对象注册TestBC2Activity.this.unregisterReceiver(smsReceiver);System.out.println("解绑成功");


授予权限

这里需要读取短信的权限,在AndroidManifest文件中加入
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
需要注意的是Android 6.0还需要动态申请权限,即用代码申请权限,系统会弹出是否给予读取权限的对话框让用户确认。
//android 6.0不仅需要申请动态权限,AndroidManifest中也不能少if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {    ActivityCompat.requestPermissions(this,            new String[]{Manifest.permission.RECEIVE_SMS},            1);}
其中ContextCompat.checkSelfPermission()是用来检查应用程序是否已经获取了权限,当它不等于
PackageManager.PERMISSION_GRANTED,即还没获取权限,则调用
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},1);
第一个参数是上下文,第二个参数是要申请的权限,可以申请多个,第三个是回调返回值,我没用到就随便设为1了。
关于权限问题,我也是看别人的博客的,详情http://blog.csdn.net/uana_777/article/details/51211535

下面是完整源码

Activity

package com.example.testbc2;import android.Manifest;import android.content.IntentFilter;import android.content.pm.PackageManager;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class TestBC2Activity extends AppCompatActivity {    private Button registerButton = null;    private Button unregisterButton = null;    private SMSReceiver smsReceiver = null;    private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        registerButton = (Button) findViewById(R.id.registerButton);        unregisterButton = (Button) findViewById(R.id.unregisterButton);        //android6.0不仅需要申请动态权限,Mainfest中也不能少        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(this,                    new String[]{Manifest.permission.RECEIVE_SMS},                    1);        }        registerButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //生成一个BroiadcastReceiver对象                smsReceiver = new SMSReceiver();                //生成IntentFilter对象                IntentFilter filter = new IntentFilter();                //为IntentFilter添加一个Action                filter.addAction(SMS_ACTION);                //讲BroadcastReceiver对象注册到系统当中                TestBC2Activity.this.registerReceiver(smsReceiver,filter);                System.out.println("绑定成功");            }        });        unregisterButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //解除BroadcastReceiver对象注册                TestBC2Activity.this.unregisterReceiver(smsReceiver);                System.out.println("解绑成功");            }        });    }}
自定义的BroadcastReceiver的子类SMSReceiver
package com.example.testbc2;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;/** * Created by ZLJ on 2017/2/26. */public class SMSReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        System.out.println("Receiver Message");        //接受intent对象当中的数据        Bundle bundle = intent.getExtras();        //Bundle对象当中有个属性名为pdus,这个属性值是一个Object数组        Object[] myOBJpdus = (Object[]) bundle.get("pdus");        //创建一个SmsMessage类型的数组        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];        for(int i=0; i<myOBJpdus.length; i++) {            //使用Object数组当中的对象创建SmsMessage对象            messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);            //调用对象相应方法,获取相应内容            String s = "手机号:" + messages[i].getOriginatingAddress() + "\n";            s += "短信内容:" +  messages[i].getDisplayMessageBody();            System.out.println(s);        }    }}
1 0
原创粉丝点击