谷歌为了保护用户的个人信息不被泄漏,所以在android6.0之后,即api23之后对Android权限进行了加强,即你需要某种权限的时候,以前的时候只要在清单文件里面注册就行了。而现在你不仅要在清单文件里面注册,你还要在代码中动态申请。下面我放上代码。
package com.example.zhujunxian.zhujunxian;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class EX01_04 extends Activity {
private EX01_04Sreceiver mBroadcastReceiver;
private TextView textView;
private static final int REQUEST_CRITICAL_PERMISSIONS = 10;
private static final String[] CRITICAL_PERMISSION_ARRAY = {
//要申请的权限,放在一个数组里面
Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_EXTERNAL_STORAGE
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ex01_04);
textView = (TextView) findViewById(R.id.myTextView);
textView.setText("等待接收短信。。。");
IntentFilter intentFilter =new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
mBroadcastReceiver =new EX01_04Sreceiver();
this.registerReceiver(mBroadcastReceiver,intentFilter);
//如果没有数组中的那两个权限,动态申请
if (!hasCriticalPermission()) {
requestPermissions(CRITICAL_PERMISSION_ARRAY, REQUEST_CRITICAL_PERMISSIONS);
}
}
//判断是否有这个权限。。。
private boolean hasCriticalPermission() {
for (int i = 0; i < CRITICAL_PERMISSION_ARRAY.length; i++) {
if (checkSelfPermission(CRITICAL_PERMISSION_ARRAY[i])
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
}
下面放上广播接收器里面的代码
package com.example.zhujunxian.zhujunxian;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Telephony;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class EX01_04Sreceiver extends BroadcastReceiver {
/*声明静态字符串,并使用android.provider.Telephony.SMS_RECEIVED作为Action为短信的依据*/
private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context,Intent intent){
Log.d("gewei","onReceive");
//判断传来的Intent是否为短信
if (intent.getAction().equals(mACTION)){
StringBuilder sb = new StringBuilder();
//接收Intent传来的数据
Bundle bundle = intent.getExtras();
//判断bundle是否有数据。
if (bundle != null){
//puds为android 内建短信参数identifier;
//通过bundle.get("")并传一个包含pdus的对象
Object[] myOBJpdus = (Object[]) bundle.get("pdus");
//构建短信对象array,并依据收到的对象长度建立array的大小
SmsMessage [] messages = new SmsMessage[myOBJpdus.length];
for (int i = 0 ; i < myOBJpdus.length ; i++){
messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
}
for (SmsMessage currentMessage : messages){
sb.append("接收到来自:N");
sb.append(currentMessage.getDisplayMessageBody());
sb.append("N________________传来的短信__________________N");
}
}
Toast.makeText(context,sb.toString(),Toast.LENGTH_SHORT).show();
}
}
}
这是一个监听你收到短信以及你短信内容的例子。在你安装后会弹出一个申请短信读取的授权,我们点击同意就好了!!!