1. 程式人生 > >安卓6.0動態申請許可權

安卓6.0動態申請許可權

現在安卓6.0申請許可權的開原始碼也很多,但是不想專案裡引用的東西太多,能不搬的就不搬了,自己寫了一個申請許可權的,在Gerymontion上測試,還能用,如果有需要改善的,請留言.

1 寫一個介面

  

public interface PermissionListener {
        //有許可權或者申請的時候給了,就繼續做下面的動作
        void hasPermission() ;
        //沒有許可權
        void hasNoPermission() ;
        //點了不再提示
        void neverShowPermission();
}
 
 
2 寫一個申請的工具類
 
 

 
public enum PermissionUtil   {
    INSTRANSE ;
    private PermissionListener permissionListener ;
    //請求許可權
    public void responsePermission(AppCompatActivity appCompatActivity ,PermissionListener permissionListener, String... permissionName) {
        this.permissionListener 
= permissionListener; if (Build.VERSION.SDK_INT >= 23) { List<String> pList = new ArrayList<>(); for (String str : permissionName) { pList.add(str); } String[] strings = pList.toArray(new String[pList.size()]); boolean bb = checkPermissionAllGranted(appCompatActivity, strings); if
(!bb) { //如果沒有,請求 ActivityCompat.requestPermissions(appCompatActivity, strings, Constants.permissionStr.permissionResponse); } else { //有許可權 permissionListener.hasPermission(); } }else{ //小於23,沒必要申請 permissionListener.hasPermission(); } } /** * 檢查APP是否擁有指定的所有許可權 */ protected boolean checkPermissionAllGranted(Context mContext, String[] permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) { // 只要有一個許可權沒有被授予, 則直接返回 false return false; } } return true; } public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults,AbstractActivity activity){ if (requestCode == Constants.permissionStr.permissionResponse) { if (PackageManager.PERMISSION_GRANTED == grantResults[0] ) { //給了許可權可以直接去操作 permissionListener.hasPermission(); } else { if(neverShow(permissions, activity)){ permissionListener.neverShowPermission(); }else{ permissionListener.hasNoPermission(); } } } } //在使用者已經拒絕授權的情況下,如果shouldShowRequestPermissionRationale返回false // 可以推斷出使用者選擇了不在提示選項,在這種情況下需要引導使用者至設定頁手動授權 private boolean neverShow(String permissions[], AbstractActivity activity){ boolean showagain ; if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[0])) { showagain = true ; }else{ showagain = false ; } return showagain ; } }
3 假如使用者點了不再提示,提示使用者去設定(這個bug肯定是有的,自行解決,我們是特定的機型,所以不需要適配其他機型)

 
public enum DailogUtil {
    INSTRANS;
    public void getDailog(final AbstractActivity activity, final PermissionListener permissionListener) {
        new AlertDialog.Builder(activity)
                .setMessage("許可權都不給我,你還想使用APP?去設定頁面手動授權再來吧!!!!")
                .setPositiveButton("去授權", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //引導使用者至設定頁手動授權
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        //Constants.packageName  專案的包名,你可以寫死
                        Uri uri = Uri.fromParts("package", Constants.packageName, null);
                        intent.setData(uri);
                        activity.startActivity(intent);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //引導使用者手動授權,許可權請求失敗
                        permissionListener.hasNoPermission();
                    }
                }).setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                //引導使用者手動授權,許可權請求失敗
                permissionListener.hasNoPermission();
            }
        }).show();
    }
}
4 在申請的Activity裡面去申請
   4.1 定義PermissionListener 

 
	PermissionListener permissionListener ;
   4.2 初始化介面   

 
	permissionListener= new PermissionListener() {
    	@Override
    	public void hasPermission() {
        Log.e("MainActivity-->","申請成功");
        // TODO: 2017/12/20
    	}

    	@Override
    	public void hasNoPermission() {
        Log.e("MainActivity-->","申請失敗");
        // TODO: 2017/12/20
    	}

    	@Override
    	public void neverShowPermission() {
        Log.e("MainActivity-->","點選了不再提示");
        DailogUtil.INSTRANS.getDailog(MainActivity.this , permissionListener );
    	}
	};
5 點選呼叫 
 
	case R.id.requestpermission:
   	 /**
     	* Manifest.permission.WRITE_EXTERNAL_STORAGE;
     	* Manifest.permission.WRITE_SETTINGS;
     	* 定義成常量了
     	*/
    	PermissionUtil.INSTRANSE.responsePermission(this, permissionListener, new String[]{
            Constants.permissionStr.WRITE_EXTERNAL_STORAGE,Constants.permissionStr.Setting
    	});
    	break;
5 重寫 onRequestPermissionsResult

 
	@Override
	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    	PermissionUtil.INSTRANSE.onRequestPermissionsResult(requestCode,permissions,grantResults,this);
	}
6 打完收工