android 权限动态申请
名字其實(shí)有點(diǎn)讓人感覺(jué)高大上"權(quán)限動(dòng)態(tài)申請(qǐng)",其實(shí)也沒(méi)有什么,
以前做Android程序的時(shí)候,比如需要打開(kāi)攝像頭
那么需要在
?
?
然后就可以了,
但是Android6.0之后呢,有些權(quán)限必須手動(dòng)讓用戶同意才可以,哪些權(quán)限需要用戶手動(dòng)同意,哪些不需要這里大家自行百度
現(xiàn)在說(shuō)一下
直接上程序吧
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;//獲取應(yīng)用的Target版本} catch (PackageManager.NameNotFoundException e) {e.printStackTrace(); // Log.e("err", "檢查權(quán)限_err0"); }if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Build.VERSION.SDK_INT是獲取當(dāng)前手機(jī)版本 Build.VERSION_CODES.M為6.0系統(tǒng)//如果系統(tǒng)>=6.0if (targetSdkVersion >= Build.VERSION_CODES.M) {//第 1 步: 檢查是否有相應(yīng)的權(quán)限boolean isAllGranted = checkPermissionAllGranted(PermissionString);if (isAllGranted) {//Log.e("err","所有權(quán)限已經(jīng)授權(quán)!");return;}// 一次請(qǐng)求多個(gè)權(quán)限, 如果其他有權(quán)限是已經(jīng)授予的將會(huì)自動(dòng)忽略掉ActivityCompat.requestPermissions(this,PermissionString, 1);}}}/*** 檢查是否擁有指定的所有權(quán)限*/private boolean checkPermissionAllGranted(String[] permissions) {for (String permission : permissions) {if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {// 只要有一個(gè)權(quán)限沒(méi)有被授予, 則直接返回 false//Log.e("err","權(quán)限"+permission+"沒(méi)有授權(quán)");return false;}}return true;}//申請(qǐng)權(quán)限結(jié)果返回處理 @Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {boolean isAllGranted = true;// 判斷是否所有的權(quán)限都已經(jīng)授予了for (int grant : grantResults) {if (grant != PackageManager.PERMISSION_GRANTED) {isAllGranted = false;break;}}if (isAllGranted) {// 所有的權(quán)限都授予了Log.e("err","權(quán)限都授權(quán)了");} else {// 彈出對(duì)話框告訴用戶需要權(quán)限的原因, 并引導(dǎo)用戶去應(yīng)用權(quán)限管理中手動(dòng)打開(kāi)權(quán)限按鈕//容易判斷錯(cuò)//MyDialog("提示", "某些權(quán)限未開(kāi)啟,請(qǐng)手動(dòng)開(kāi)啟", 1) ; }}}?
?
程序啟動(dòng)的時(shí)候檢查權(quán)限
?
現(xiàn)在說(shuō)一下流程
?
?
說(shuō)一下,如果調(diào)用這個(gè)
就會(huì)執(zhí)行
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("前去設(shè)置");mButton2.setTextColor(Color.BLUE);mButton1.setText("取消");mButton1.setTextColor(Color.BLACK);mTextView1.setText(str1);mTextView2.setText(str2);AlertDialogBuilder.setView(mView);//對(duì)話框加載視圖 final android.support.v7.app.AlertDialog alertdialogbuilder = AlertDialogBuilder.create();alertdialogbuilder.setCanceledOnTouchOutside(false);//點(diǎn)擊外圍不消失 alertdialogbuilder.show();mButton1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {alertdialogbuilder.dismiss();}});mButton2.setOnClickListener(new View.OnClickListener() {@Overridepublic 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);}});}應(yīng)用設(shè)置界面
?
?
?
然后就沒(méi)了,
現(xiàn)在說(shuō)一下BUG問(wèn)題
?大家百度
checkSelfPermission總是返回 false ?很多說(shuō)這個(gè)問(wèn)題的
這就導(dǎo)致一個(gè)問(wèn)題,如果用戶進(jìn)入?應(yīng)用設(shè)置界面 設(shè)置了允許對(duì)應(yīng)的權(quán)限 ?然后回到程序,
結(jié)果...總是調(diào)用這個(gè)....這就太奇葩了
?
?后來(lái)我發(fā)現(xiàn),同時(shí)滿足這兩條條件再檢測(cè)就不會(huì)了,可以準(zhǔn)確的檢查,
但是我重復(fù)安裝了幾次我的APP,還是有個(gè)奇怪的問(wèn)題,前面我都拒絕,然后就會(huì)提示進(jìn)入 ?應(yīng)用管理界面
按理說(shuō)默認(rèn)應(yīng)該是詢問(wèn)狀態(tài),,但是卻是 ?顯示的允許......然后發(fā)現(xiàn)必須自己重復(fù)點(diǎn)擊一下拒絕,然后再點(diǎn)擊一下允許
回到界面后才會(huì)正常........按理來(lái)說(shuō)用戶不會(huì)像我似的,因?yàn)槲乙恢痹谡{(diào)試
但是確實(shí)是一個(gè)問(wèn)題.....
?
?
?
?
?
?但是還有個(gè)問(wèn)題,那天讓一個(gè)朋友測(cè)試,發(fā)現(xiàn)另一個(gè)問(wèn)題,,如果在安裝的時(shí)候就修改,不允許任何權(quán)限,,那么安裝完以后,也不會(huì)進(jìn)入
?
?
?所以最終決定,把這里屏蔽了
因?yàn)楝F(xiàn)在還不能準(zhǔn)確的判斷
以后判斷呢只能是異常捕獲了........
假如說(shuō),用戶沒(méi)有同意攝像頭權(quán)限,然后執(zhí)行攝像頭的一些程序的時(shí)候肯定會(huì)報(bào)錯(cuò)
然后在異常捕獲里提醒用戶 ?跳轉(zhuǎn)到應(yīng)用權(quán)限管理里面去打開(kāi)權(quán)限
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangfengwu/p/9304373.html
總結(jié)
以上是生活随笔為你收集整理的android 权限动态申请的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: docker 安装 centos
- 下一篇: Linux下部署多个Tomcat