我理解,在涉及关键权限的任何操作之前,我必须检查用户是否允许该权限,如果不允许,则显示要求获得权限的理由。然后我将在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" />
以下是默认基本原理的屏幕截图:
这是执行getActivity()时显示的基本原理:
答案 0 :(得分:1)
以后在以后发现这个有趣的人的私聊中讨论的内容摘要:
此部分应用程序已按照Android Marshmallow中新Runtime Permission model的指导原则正确完成。
问题在于应用程序启动时,批量发出了四个权限请求。
问题不在于提供的代码部分,而是源于自编写的库(供内部使用),该库在首次调用时要求所有权限。这样做是为了使库快速兼容。
解决方案:重写库以在实际需要时请求权限,因此整个应用可能具有Marshmallow预期的用户行为。
祝你好运:)