android动态权限申请

谷歌为了保护用户的个人信息不被泄漏,所以在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();
        }
    }
}

这是一个监听你收到短信以及你短信内容的例子。在你安装后会弹出一个申请短信读取的授权,我们点击同意就好了!!!

你可能感兴趣的:(android)