1. 程式人生 > >動態獲取許可權的封裝

動態獲取許可權的封裝

一. PermissionUtil 申請許可權工具類

沒有處理的問題:

1.將請求碼和Callback放到Map中,不會被覆蓋

2.沒有處理使用者點選許可權不再詢問時,做出相應的提示

import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class PermissionUtil {

    private Activity mActivity;
    private int mReqCode;//請求碼
    private CallBack mCallBack;

    public static interface CallBack {
        void grandAll();//所有必要許可權已經申請了,可以跳到主介面

        void denied();//存在沒有獲取的許可權,則直接退出程式
    }

    public PermissionUtil(Activity activity) {
        mActivity = activity;
    }

    /**
     * 申請許可權的方法
     *
     * @param needPermissions
     * @param reqCode
     * @param callBack
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    public void request(List<String> needPermissions, int reqCode, CallBack callBack) {
        if (mActivity == null) {
            throw new IllegalArgumentException("activity is null");
        }

        //如果機器sdk小於23不需要動態獲取許可權
        if (Build.VERSION.SDK_INT < 23) {
            callBack.grandAll();//預設全部許可權已經授予
            return;
        }

        mReqCode = reqCode;
        mCallBack = callBack;

        //存放仍需要獲取的許可權
        List<String> reqPermissions = new ArrayList<>();
        for (String permission : needPermissions) {
            Log.e("TAG", needPermissions + "0");

            if (mActivity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                //如果許可權還沒被獲取,則新增進來
                reqPermissions.add(permission);
                Log.d("TAG", reqPermissions + "1");
            }

        }
        //如果存放仍需要獲取的許可權為空,則意味著所有許可權都被授予了
        if (reqPermissions.isEmpty()) {
            callBack.grandAll();
            Log.d("TAG", reqPermissions + "2");
            return;
        }

        //如果不為空,要將這個需要請求的許可權,提示授予
        mActivity.requestPermissions(reqPermissions.toArray(new String[]{}), reqCode);

    }

    /**
     * 處理許可權後返回的回撥
     * 1.當用戶執行完獲取許可權的操作後的回撥
     * 提示它還有哪些許可權沒有被獲取
     */
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == mReqCode) {
            boolean grantAll = true;
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    grantAll = false;
                    Toast.makeText(mActivity, permissions[i] + "未授權", Toast.LENGTH_SHORT).show();
                    break;
                }
            }

            if (grantAll) {//如果全部都授權了
                mCallBack.grandAll();
            } else {
                mCallBack.denied();
            }


        }
    }
}

二、閃屏頁的許可權判斷,授予了所有必要許可權才會跳轉到主介面

SplashActivity.java

import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

/**
 * 動態申請許可權的介面
 * 1.放在第一個啟動的介面(在AndroidManifest.xml中配置)
 */
public class SplashActivity extends AppCompatActivity {
    //定義所有需要申請的許可權
    public static List<String> sNeedReqPermissions = new ArrayList<>();
    private PermissionUtil mPermissionUtil;

    static {
        //靜態程式碼塊中新增許可權
        sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE);
        sNeedReqPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
        sNeedReqPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        sNeedReqPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        sNeedReqPermissions.add(Manifest.permission.ACCESS_WIFI_STATE);
        sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE);
        sNeedReqPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE);
    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPermissionUtil = new PermissionUtil(this);
        mPermissionUtil.request(sNeedReqPermissions, 100, new PermissionUtil.CallBack() {
            @Override
            public void grandAll() {
                toMainActivity();
                finish();
            }

            @Override
            public void denied() {
                finish();//直接finish
            }
        });

    }

    //跳轉到第二個節目
    private void toMainActivity() {
        startActivity(new Intent(this, BaiduMapActivity.class));

    }

    /**
     * 用來返回給申請工具類來做具體回撥
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        mPermissionUtil.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}