运行时权限 - 请求已授予权限的权限

时间:2018-05-26 19:21:26

标签: android android-permissions runtime-permissions

我编写了以下脚本,以获取联系人和位置的多个运行时权限。我分别在布局中使用两个开关用于触点和位置。如果我单击“联系人”开关,则会按预期询问联系人和位置的权限。然后我手动删除了"应用权限"设置活动。现在,如果我单击位置开关,则再次询问联系人和位置。

enter image description here

我的问题是,因为我已经在第一时间授予了联系人权限,我可以在"应用权限和#34;中看到权限。设置活动,为什么它再次要求联系人权限?即使我在hasPermissions方法中检查它。

public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1001;
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS,
        Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.basic_permissions);
    CONTACTS_ACCESS_SWITCH = (Switch) findViewById(R.id.contactsPermissionSwitch);
    LOCATION_ACCESS_SWITCH = (Switch) findViewById(R.id.locationPermissionSwitch);
    CONTACTS_ACCESS_SWITCH.setOnClickListener(requestPermissionMethod);
    LOCATION_ACCESS_SWITCH.setOnClickListener(requestPermissionMethod);
}

private void requestPermissionMethod() {
    if (!hasPermissions(BasicPermissions.this, PERMISSIONS)) {
        ActivityCompat.requestPermissions(BasicPermissions.this, PERMISSIONS, REQUEST_ID_MULTIPLE_PERMISSIONS);
    }
}

private boolean hasPermissions(Context context, String... permissions) {
    if (context != null && permissions != null) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(BasicPermissions.this, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

清单文件:

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

配置:

在Android 6.0 android studio仿真器设备中进行测试。

compileSdkVersion 27。

minSdkVersion 18

targetSdkVersion 27

2 个答案:

答案 0 :(得分:1)

由于代码是使用Array编写的,因此即使已经授予了数组,它也会对数组中的所有值发出请求权限。所以我重写了代码以使用ArrayList代替Array。现在它的工作完全符合预期。

private  boolean requestPermissionMethod() {
    int permissionContacts = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
    int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
    List<String> listPermissionsNeeded = new ArrayList<>();
    if (locationPermission != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (permissionContacts != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.READ_CONTACTS);
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
        return false;
    }
    return true;
}

答案 1 :(得分:0)

如果您请求多个权限,则会要求多个权限。

如果您只希望它请求您当前没有的权限,则必须自己检查,然后从“PERMISSIONS”数组中删除您已拥有的权限。