今天学会了如何通过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文件中加入
需要注意的是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);
}
}
}