名字其實有點讓人感覺高大上"權限動態申請",其實也沒有什么,
以前做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,還是有個奇怪的問題,前面我都拒絕,然后就會提示進入 應用管理界面
按理說默認應該是詢問狀態,,但是卻是 顯示的允許......然后發現必須自己重復點擊一下拒絕,然后再點擊一下允許
回到界面后才會正常........按理來說用戶不會像我似的,因為我一直在調試
但是確實是一個問題.....
但是還有個問題,那天讓一個朋友測試,發現另一個問題,,如果在安裝的時候就修改,不允許任何權限,,那么安裝完以后,也不會進入
所以最終決定,把這里屏蔽了
因為現在還不能准確的判斷
以后判斷呢只能是異常捕獲了........
假如說,用戶沒有同意攝像頭權限,然后執行攝像頭的一些程序的時候肯定會報錯
然后在異常捕獲里提醒用戶 跳轉到應用權限管理里面去打開權限