今天学会了如何通过Android的广播机制来获取短信通知并得到短信内容,这里主要用到了安卓的广播类BroadcastReceiver和
里面的onReceive方法。
首先自定义子类SMSReceiver继承BroadcastReceiver,重写onReceive方法。然后在AndroidManifest.xml或通过代码动态配置
过滤器,当有通过过滤器的广播时,系统会自动new一个子类对象,并调用对象的onReceive方法。
注册广播有两种方法,这两种方法的区别是:
AndroidManifest.xml中注册的广播是一直存在的,即使应用程序没有启动,当一有过滤的广播通知,就会创建子类对象并调用onReceive方法。通过java代码实现的动态注册,可以实现按需监听,并且可以按需注销。主要用在Activity更新中,当Activity不显示时就注销掉,节省系统资源。
<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下面是完整源码
Activitypackage 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的子类SMSReceiverpackage 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); } }}
新闻热点
疑难解答