關於android api23之後的權限設置

最近在作個項目,遇到點小問題,須要在用到某些權限的時候,好比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);
}
相關文章
相關標籤/搜索