与Marshmallow权限系统

时间:2016-02-18 11:12:31

标签: android android-6.0-marshmallow android-permissions

我理解,在涉及关键权限的任何操作之前,我必须检查用户是否允许该权限,如果不允许,则显示要求获得权限的理由。然后我将在onRequestPermissionsResult回调方法中收集结果,依此类推。

但是使用Nexus 6p测试应用程序我会在调用任何方法之前自动找出该平台的基本原理。似乎只是阅读平台,平台正在向用户展示理由,所以,我无法理解是否值得检查和创建权限方法。或者,如果它是一个新的操作系统功能,它已过时请求权限(我的手机正在运行6.0.1)。

以下是管理权限的代码:

private void checkLocationPermission() {
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            this.requestPermissions(new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, PermissionHelper.SMS_PERMISSION_IDENTIFIER);
        }
    }


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PermissionHelper.LOCATION_PERMISSION_IDENTIFIER: {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getContext(), "Our app will be unable to locate you.", Toast.LENGTH_SHORT).show();
                }
                return;
            }
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                break;
        }
    }

但我的担忧与代码无关,但事实上平台似乎并不需要这个。因为当应用程序刚刚启动时(但尚未达到任何权限的代码),只需阅读AndroidManifest.xml,就会立即要求用户授予所有权限。使所有权限代码变得毫无意义。

The Manifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Internet access is required to show Google maps. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- To use Google places -->
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<!-- These services require your GPS location. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- To detect if an internet connection is available. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- We would like to know your phone number. -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_SMS" />
<!-- To be reminded of insurance/MOT/servicing renewal then -->
<!-- we'll need to register those alarms on boot-up. -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- push notifications -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="ie.aaireland.android.theaa.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

以下是默认基本原理的屏幕截图:

enter image description here

这是执行getActivity()时显示的基本原理:

enter image description here

1 个答案:

答案 0 :(得分:1)

以后在以后发现这个有趣的人的私聊中讨论的内容摘要:

  • 此部分应用程序已按照Android Marshmallow中新Runtime Permission model的指导原则正确完成。

  • 问题在于应用程序启动时,批量发出了四个权限请求。

  • 问题不在于提供的代码部分,而是源于自编写的库(供内部使用),该库在首次调用时要求所有权限。这样做是为了使库快速兼容。

  • 解决方案:重写库以在实际需要时请求权限,因此整个应用可能具有Marshmallow预期的用户行为。

祝你好运:)