1.需求:
Unity項目中適配Android6.0權限管理
2.實現原理:
在Unity中使用到相關權限時候調用Andorid層,讓Android層去請求權限。
3.實現:
public int XXPERMISSIONCODE = 0;
public boolean requstePermission(String permisson){
if (ContextCompat.checkSelfPermission(this, permisson) != PackageManager.PERMISSION_GRANTED) {
//無權限,開始請求權限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS},XXPERMISSIONCODE);
return false;
}else{
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
switch (requestCode){
case XXPERMISSIONCODE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
//有權限了,回調Unity接口
}else{
if (ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[0])) {
//嘗試告訴用戶為什么要請求權限,可以再次發起請求或者返回Unity無權限
}else {
//無法再次請求權限,可以處理直接退出程序或者告訴Unity無權限
}
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
4.接口解釋:
public static int checkSelfPermission(Context context, String permission)
查詢是否有對應的權限:
返回值等于PackageManager.PERMISSION_GRANTED為有權限
返回值等于PackageManager.PERMISSION_DENIED 為無權限
public static void requestPermissions(final Activity activity,final String[] permissions, final int requestCode)
異步請求對應的權限,完成后會回調onRequestPermissionsResult。
注意:這個方法不必判斷是否為Android6.0+,系統會自己辦你出來,如果小于M的,會直接回調,并且為獲得權限。
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
系統回調
public static boolean shouldShowRequestPermissionRationale(Activity activity, String permission)
判斷是否還能再發起請求,當用戶勾選不再提示之后,返回false。可以對True和Fasle情況分別對用戶進行說明和操作。
Android6.0權限管理
對于6.0以下的權限及在安裝的時候,根據權限聲明產生一個權限列表,用戶只有在同意之后才能完成app的安裝,造成了我們想要使用某個app,就要默默忍受其一些不必要的權限(比如是個app都要訪問通訊錄、短信等)。而在6.0以后,我們可以直接安裝,當app需要我們授予不恰當的權限的時候,我們可以予以拒絕(比如:單機的象棋對戰,請求訪問任何權限,我都是不同意的)。當然你也可以在設置界面對每個app的權限進行查看,以及對單個權限進行授權或者解除授權。
新的權限機制更好的保護了用戶的隱私,Google將權限分為兩類,一類是Normal Permissions,這類權限一般不涉及用戶隱私,是不需要用戶進行授權的,比如手機震動、訪問網絡等;另一類是Dangerous Permission,一般是涉及到用戶隱私的,需要用戶進行授權,比如讀取sdcard、訪問通訊錄等。