移動開發----android6.0是否獲取到權限和運行時請求權限

android6.0是否獲取到權限和運行時請求權限


之前做騰訊地圖和二維碼掃描遇到的問題,在app裝上之後危險權限是需要用戶同意後才能獲取到權限,然而android6.0不能提示獲取,然後需要在使用時該權限時判斷是否獲取到了權限,再做其他邏輯,

Requesting Permissions at Run Time
從Android6.0(API >= 23)開始,用戶在APP運行的時候授予其權限而不是像以前安裝的時候就通通授予了(以前授權方式好像沒什麼卵用)。由於不在需要在安裝或更新APP的時候授予相關權限,這就簡化了APP的安裝過程。這也提高了用戶對APP功能的控制,比如:用戶可以選擇讓一個Camera APP使用Camera,用戶可以在任何時候在設置面板撤銷這個權限。。。
看完是不是有點像我們在國產ROM中常見到的每個應用運行時權限授予。

系統權限也被分城normal和dangerous兩類:

Normal類的權限不會直接涉及到用戶隱私風險。如果APP在Manifest文件中聲明瞭Normal類的權限,系統會自動授予這些權限。 Dangerous類的權限可能會讓APP涉及到用戶機密的數據。如果APP在Manifest文件中聲明瞭Normal類的權限,系統會自動授予這些權限。如果在Manifest文件中添加了Dangerous類的權限,用戶必須明確的授予對應的權限後APP才具有這些權限。
直接上代碼

使用ContextCompat.checkSelfPermission()檢查權限,第一個參數是上下文,第二個是相關權限.如果APP有該權限返回PackageManager.PERMISSION_GRANTED,APP接着可以進行對應操作;如果沒有權限,以上方法返回PERMISSION_DENIED,APP需要明確的向用戶請求授權。Android提供shouldShowRequestPermissionRationale()方法求向用戶展示爲啥你需要這個權限,當用戶之前已經請求過該權限並且拒絕了授權這個方法返回true。
注意:如果用戶拒絕權限請求的時候選擇了Don’t ask again選項,上面的方法返回false,當然如果設備本身就不允許有這個權限也是返回false。
requestPermissions()就是請求權限方法,異步方法。需要三個參數,上下文,需要請求的權限字符串數組,int類型常量請求碼,請求碼在回調中使用,下面是代碼

/**
 * 判斷是否獲取到相機權限
 */
if(ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    if(ActivityCompat.shouldShowRequestPermissionRationale(HuaQiActivity.this,Manifest.permission.CAMERA)) {//是否請求過該權限


    }else {//沒有則請求獲取權限
        ActivityCompat.requestPermissions(context,new String[]{Manifest.permission.CAMERA},REQUESTCODE);
    }
}else {		//如果已經獲取到了權限則直接進行下一步操作
    Intent intent = new Intent(context, CaptureActivity.class);
    startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
}
用戶點擊後允許或拒絕該權限後有回調響應,如果允許會返回值,直接判斷

代碼

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUESTCODE:
            if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                Intent intent = new Intent(context, CaptureActivity.class);
                startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
            }else {
                Toast.makeText(HuaQiActivity.this,"您拒絕了獲取到相機權限,請手動獲取或重裝軟件",Toast.LENGTH_SHORT).show();
            }
            break;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章