请求权限 API 22 Android

Ask for permissions with API 22 Android

在我工作的项目中,我们有一组权限,其中 3 个被标记为 dangerous。在 Android < Android 6.0.0 的设备上没有问题,但是对于最新版本,应用程序无法正常工作。

因此,在 google 中搜索有关权限的信息,我到达了 Google 文档页面,其中讨论了如何请求权限:http://developer.android.com/intl/es/training/permissions/requesting.html

他们使用此代码。

if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) { ... }

其中 ContextCompat.CheckSelfPermission(..) 仅在 API 23.

但是问题来了,对于项目中的某些规范(老板等...),我们无法升级到 API23,以使用包含此方法的库兼容。

所以我的问题是:

有什么方法可以处理权限请求,做一些变通办法吗?

权限:

<uses-permission android:name="xx.xx.otr.app.providers.imps.permission.READ_ONLY" />
    <uses-permission android:name="xx.xx.otr.app.providers.imps.permission.WRITE_ONLY" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="es.in2.otr.app.im.permission.IM_SERVICE" />
    <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <permission
        android:name="xx.xx.otr.app.im.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="xx.xx.otr.app.im.permission.C2D_MESSAGE" />

    <permission
        android:name="xx.xx.otr.app.im.permission.IM_SERVICE"
        android:description="@string/perm_desc"
        android:label="@string/perm_label"
        android:permissionGroup="android.permission-group.MESSAGES"
        android:protectionLevel="dangerous" />
    <permission
        android:name="xx.xx.otr.app.providers.imps.permission.READ_ONLY"
        android:description="@string/ro_perm_desc"
        android:label="@string/ro_perm_label"
        android:permissionGroup="android.permission-group.MESSAGES"
        android:protectionLevel="dangerous" />
    <permission
        android:name="xx.xx.otr.app.providers.imps.permission.WRITE_ONLY"
        android:description="@string/wo_perm_desc"
        android:label="@string/wo_perm_label"
        android:permissionGroup="android.permission-group.MESSAGES"
        android:protectionLevel="dangerous" />

如下请求您需要的权限,

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}


Get the response of the permission as follows, 
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

有关它的更多详细信息,您可以参考 google 开发人员文档, http://developer.android.com/training/permissions/requesting.html

希望对您有所帮助。

看看这个link

"The easiest way to manage runtime permissions is by using third-party libraries" PermissionsDispatcher 专为危险权限开发

https://guides.codepath.com/android/Managing-Runtime-Permissions-with-PermissionsDispatcher