android 權限動態申請


名字其實有點讓人感覺高大上"權限動態申請",其實也沒有什么,

以前做Android程序的時候,比如需要打開攝像頭

那么需要在

 

 

然后就可以了,

但是Android6.0之后呢,有些權限必須手動讓用戶同意才可以,哪些權限需要用戶手動同意,哪些不需要這里大家自行百度

現在說一下

直接上程序吧

public void checkPermission()
    {
        int targetSdkVersion = 0;
        String[] PermissionString={Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA};
        try {
            final PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0);
            targetSdkVersion = info.applicationInfo.targetSdkVersion;//獲取應用的Target版本
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
//            Log.e("err", "檢查權限_err0");
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //Build.VERSION.SDK_INT是獲取當前手機版本 Build.VERSION_CODES.M為6.0系統
            //如果系統>=6.0
            if (targetSdkVersion >= Build.VERSION_CODES.M) {
                //第 1 步: 檢查是否有相應的權限
                boolean isAllGranted = checkPermissionAllGranted(PermissionString);
                if (isAllGranted) {
                    //Log.e("err","所有權限已經授權!");
                    return;
                }
                // 一次請求多個權限, 如果其他有權限是已經授予的將會自動忽略掉
                ActivityCompat.requestPermissions(this,
                        PermissionString, 1);
            }
        }
    }

    /**
     * 檢查是否擁有指定的所有權限
     */
    private boolean checkPermissionAllGranted(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                // 只要有一個權限沒有被授予, 則直接返回 false
                //Log.e("err","權限"+permission+"沒有授權");
                return false;
            }
        }
        return true;
    }

    //申請權限結果返回處理
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            boolean isAllGranted = true;
            // 判斷是否所有的權限都已經授予了
            for (int grant : grantResults) {
                if (grant != PackageManager.PERMISSION_GRANTED) {
                    isAllGranted = false;
                    break;
                }
            }
            if (isAllGranted) {
                // 所有的權限都授予了
                Log.e("err","權限都授權了");
            } else {
                // 彈出對話框告訴用戶需要權限的原因, 並引導用戶去應用權限管理中手動打開權限按鈕
                //容易判斷錯
                //MyDialog("提示", "某些權限未開啟,請手動開啟", 1) ;
            }
        }
    }

 

 

程序啟動的時候檢查權限

 

現在說一下流程

 

 

說一下,如果調用這個

就會執行

    private void MyDialog(final String str1, final String str2, final int index) {
        android.support.v7.app.AlertDialog.Builder AlertDialogBuilder = new android.support.v7.app.AlertDialog.Builder(MainActivity.this, R.style.MyDialog);
        View mView = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_config_button2, null);

        final TextView mTextView1 = mView.findViewById(R.id.tvdogcon1);
        final TextView mTextView2 = mView.findViewById(R.id.tvdogcon2);
        final Button mButton1 = mView.findViewById(R.id.btdogcon1);
        final Button mButton2 = mView.findViewById(R.id.btdogcon2);
        mButton2.setText("前去設置");
        mButton2.setTextColor(Color.BLUE);
        mButton1.setText("取消");
        mButton1.setTextColor(Color.BLACK);

        mTextView1.setText(str1);
        mTextView2.setText(str2);

        AlertDialogBuilder.setView(mView);//對話框加載視圖

        final android.support.v7.app.AlertDialog alertdialogbuilder = AlertDialogBuilder.create();
        alertdialogbuilder.setCanceledOnTouchOutside(false);//點擊外圍不消失

        alertdialogbuilder.show();

        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertdialogbuilder.dismiss();

            }
        });
        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertdialogbuilder.dismiss();
                Intent intent = new Intent();
                intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                intent.setData(Uri.fromParts("package", getPackageName(), null));
                startActivity(intent);
            }
        });
    }

應用設置界面

 

 

 

然后就沒了,

現在說一下BUG問題

 大家百度

checkSelfPermission

總是返回 false  很多說這個問題的

這就導致一個問題,如果用戶進入 應用設置界面 設置了允許對應的權限  然后回到程序,

結果...總是調用這個....這就太奇葩了

 

 后來我發現,同時滿足這兩條條件再檢測就不會了,可以准確的檢查,

但是我重復安裝了幾次我的APP,還是有個奇怪的問題,前面我都拒絕,然后就會提示進入  應用管理界面

按理說默認應該是詢問狀態,,但是卻是  顯示的允許......然后發現必須自己重復點擊一下拒絕,然后再點擊一下允許

回到界面后才會正常........按理來說用戶不會像我似的,因為我一直在調試

但是確實是一個問題.....

 

 

 

 

 

 但是還有個問題,那天讓一個朋友測試,發現另一個問題,,如果在安裝的時候就修改,不允許任何權限,,那么安裝完以后,也不會進入

 

 

 所以最終決定,把這里屏蔽了

因為現在還不能准確的判斷

以后判斷呢只能是異常捕獲了........

假如說,用戶沒有同意攝像頭權限,然后執行攝像頭的一些程序的時候肯定會報錯

然后在異常捕獲里提醒用戶  跳轉到應用權限管理里面去打開權限

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM