整整大約一年沒有更新文章了,最近有點忙,簡書去中心化后看不到IT專欄了,就很少上來了。偶爾打開一次,卻依然不斷有新關注的朋友,和新點贊的消息提示,很受鼓舞。
Android 本身權限控制做的不太理想,6.0也出了一套新的運行時權限系統,而在此之前,小米的miui系統就已經領先一步出了類似的安全管理機制,就是安全中心,可以針對單個app的某個權限做相應的設置,禁止某項權限,這對用戶是好事,不再像以前那樣,要安裝app就必須要接受那一連串的不相干的權限。
說到這里,再鄙視一下微博,最新版的微博禁掉某些權限,app會無休止的提示,非常討厭,簡直就是流氓,可以簡單地推測微博的產品經理和程序員都是沒有立場,沒有品質的一伙人。
有了安全中心這種簡單的權限管理設置對用戶是好事,但對程序員來說就是個頭疼的事了,處理不好,app會因為某項權限的缺失而莫名其妙的失靈,出bug,因而很容易受到不明所以的領導的批評。
到底有沒有某項權限,怎么檢測呢,基于以往 Android 在這方面的不精細,很多人都不會太在意這方面的邏輯判斷,新出的6.0系統也只是基于targetSdkVersion 23以上的app的判斷,包括6.0以下的版本,怎樣判斷是不是被安全中心這種禁掉了呢,這就需要 AppOpsManager 這個類了,廢話不能再多說了,下面直接上判斷方法:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
int checkResult = appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_FINE_LOCATION, Binder.getCallingUid(), context.getPackageName());
if(checkResult == AppOpsManager.MODE_ALLOWED){
Toast.makeText(context,"有權限",Toast.LENGTH_LONG).show();
Log.e("jijiaxin","有權限");
}else if(checkResult == AppOpsManager.MODE_IGNORED){
// TODO: 只需要依此方法判斷退出就可以了,這時是沒有權限的。
Toast.makeText(context,"被禁止了",Toast.LENGTH_LONG).show();
Log.e("jijiaxin","被禁止了");
}else if(checkResult == AppOpsManager.MODE_ERRORED){
Toast.makeText(context,"出錯了",Toast.LENGTH_LONG).show();
Log.e("jijiaxin","出錯了");
}else if(checkResult == 4){
Toast.makeText(context,"權限需要詢問",Toast.LENGTH_LONG).show();
Log.e("jijiaxin","權限需要詢問");
}
}
比較簡單清楚了,值得一提的是這個api是在19新加入的,所以要注意加個判斷,其實 Android 官方一直有這個設置權限的入口,Setting---Security---AppOps 只是一直被google隱藏了。