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文件中加入
需要注意的是Android 6.0还需要动态申请权限,即用代码申请权限,系统会弹出是否给予读取权限的对话框让用户确认。<uses-permission android:name="android.permission.RECEIVE_SMS"/>
//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
- Android笔记之(BroadcastReceiver)广播接收短信
- BroadcastReceiver 接收系统短信广播
- 初识BroadcastReceiver--->接收短信广播
- Android之短信广播接收内容
- Android广播接收机制(BroadcastReceiver)
- Android广播接收机制(BroadcastReceiver)
- Android广播接收机制(BroadcastReceiver)
- Android之BroadcastReceiver(接收广播消息)学习笔记(一)
- android学习笔记之六广播(BroadcastReceiver)
- android学习笔记之六广播(BroadcastReceiver)
- Android BroadcastReceiver之 静态广播 笔记+demo
- Android之BroadcastReceiver 广播接受者(短信窃听实例)
- 初学Android,BroadcastReceiver之发送接收广播(七十)
- Android四大组件之Broadcast(广播接收BroadcastReceiver)
- Android之BroadcastReceiver(二):接收系统广播
- Android通过广播接收短信
- android 广播接收者--BroadcastReceiver (实现短信窃听)
- android 广播接收者--BroadcastReceiver (实现短信窃听)
- patch matching 图像块匹配算法
- Spring-Bean的构造函数和Setter执行顺序以及InitializingBean
- odd even linked list
- 用GSON 五招之内搞定任何JSON数组
- 浅谈CPU,内存,指令之间关系
- Android笔记之(BroadcastReceiver)广播接收短信
- Ansible之 Inventory 资源清单介绍
- IIS7.5 真正解决PUT、DELETE请求问题
- Study Jams_RelativeLayout
- 安卓项目搭建总结
- tcp协议之三次握手,四次挥手
- 看过这两张图,就明白 Buffer 和 Cache 之间区别
- 单调队列的原理
- lambda与linq的关系