1. 程式人生 > >Android關於獲取使用者是否允許某項許可權

Android關於獲取使用者是否允許某項許可權

Android6.0以上檢查許可權方式

if(android.os.Build.VERSION.SDK_INT >= 23) {
			if(context.getApplicationContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)==PackageManager.PERMISSION_GRANTED &&context.getApplicationContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED  ){
				isHave=true;
			}else{
				isHave=false;
			}
			
//			for(String permission:permissions){
//				isHave=(PackageManager.PERMISSION_GRANTED == context.getApplicationContext().checkSelfPermission(permission));
//				if(isHave==false){
//					break;
//				}
//			}
		}

坑點:有時候發現不管怎麼檢測,不管使用者是允許還是拒絕,檢查的結果始終是允許

解決方法:檢查你的工程的編譯版本:<uses-sdk android:targetSdkVersion="23"/>,是否是23及以上,如果編譯版本小於23或者不寫,使用以上檢查方法永遠都是使用者允許

Android 6.0一下檢查使用者是否允許某項許可權

/**
	 * 檢查許可權列表
	 * @param op
	 * 這個值被hide了,去AppOpsManager類原始碼找,如位置許可權  AppOpsManager.OP_GPS==2
	 * 0是網路定位許可權,1是gps定位許可權,2是所有定位許可權
	 * 返回值:0代表有許可權,1代表拒絕許可權 ,3代表詢問是否有 ,-1代表出錯
	 */
	public static int checkOp(Context context, int op) {
		final int version = Build.VERSION.SDK_INT;
		if (version >= 19) {
			Object object = context.getSystemService("appops");
			Class c = object.getClass();
	      	try {
		         Class[] cArg = new Class[3];
		         cArg[0] = int.class;
		         cArg[1] = int.class;
		         cArg[2] = String.class;
		         Method lMethod = c.getDeclaredMethod("checkOp", cArg);
		         return (Integer) lMethod.invoke(object, op, Binder.getCallingUid(), context.getPackageName());
	      	} catch (Exception e) {
	      		e.printStackTrace();
	      	}
		}
		return -1;
	}

跟系統廠商有關:親測小米可以判斷