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

今天学会了如何通过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添加一个Action
filter.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);
        }
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值