最近在作個項目,遇到點小問題,須要在用到某些權限的時候,好比android手機5.0或者以上的,或者有些手機好比小米,它會須要能夠檢查是否已經設置了權限,讓用戶本身選擇是否須要打開,在本身動手適配了下,最後雖然解決了問題,不過不是特別完善。android
先看代碼:安全
public void isPermissonOk(Activity activity) { WeakReference<Activity> weakReference = new WeakReference<Activity>(activity); Activity context = weakReference.get(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.ACCESS_WIFI_STATE}, 0); } if (ContextCompat.checkSelfPermission(context, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.CHANGE_WIFI_STATE}, 0); } if (ContextCompat.checkSelfPermission(context, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.INTERNET}, 0); } if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PermissionUtils.REQUEST_WRITE_EXTERNAL_STORAGE); } if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.READ_PHONE_STATE}, PermissionUtils.REQUEST_READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.CAMERA}, PermissionUtils.REQUEST_CAMERA); } if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PermissionUtils.REQUEST_READ_EXTERNAL_STORAGE); } } if (ContextCompat.checkSelfPermission(context, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.VIBRATE}, 0); } } }
代碼中咱們能夠對各類權限進行判斷是否配置了相應的權限,而後去請求權限,系統會給你相應的彈窗。ide
下面附代碼:由於主要是針對照相、獲取我的信息有些高端手機獲取不到權限,會有個回調:ui
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { MyLog.d("hzd", "check pe"); switch (requestCode) { case PermissionUtils.REQUEST_CAMERA: showCameraDialog(); break; case PermissionUtils.REQUEST_READ_EXTERNAL_STORAGE: case PermissionUtils.REQUEST_WRITE_EXTERNAL_STORAGE: showReadOrWriteExDialog(); break; case PermissionUtils.REQUEST_READ_PHONE_STATE: showReadPhoneStateDialog(); break; } }
由於android 5.0以上之後,系統對於某些敏感的權限,好比相機、讀寫外置內存須要讓用戶本身去選擇,爲了保護用戶的安全,這兒固然是google基於安全考慮,我的也以爲這樣會安全些,在android手機愈來愈容易逆向或者獲取用戶信息的時候,手機的安全愈來愈成爲個大問題。google
本人屬於第一次接觸,以前本身本人項目由於使用的是低於23如下的版本進行去作一個假兼容,其實這個方法是很好用的,不用本身去作些控制,很好的方法,不過可能會有些弊端,23或者以上的特性可能就使用不到了,有它的好處或者弊端。內存
本人水平有限,用於記錄本身的我的小小見證和成長吧。get
再附加:it
若是權限沒有打開能夠跳轉到相應的權限設置頁面去,附代碼以下:io
public static void getAppDetailSettingIntent(Context context) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", SMJApplication.getInstance().getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= 8) { intent.setAction(Intent.ACTION_VIEW); intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); intent.putExtra("com.android.settings.ApplicationPkgName", SMJApplication.getInstance().getPackageName()); } SMJApplication.getInstance().startActivity(intent); }