首页 > 解决方案 > READ_CONTACTS 权限不起作用,除非我在 android SDK 23+ 上手动关闭和打开它

问题描述

我正在开发一个应用程序,如果可用,我需要显示用户联系人图片。

下面是请求 read_contacts 权限的代码:

  public void requestPermissionOrShowRationale(Permission permission) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission.permission)) {
        PermissionRationaleDialogFragment dialogFragment =
                PermissionRationaleDialogFragment.newInstance(permission);

        dialogFragment.show(getSupportFragmentManager(), FRAGMENT_TAG_RATIONALE);
    } else {
        requestPermission(permission);
    }
}

public void requestPermission(Permission permission) {
    Timber.i("Requesting permission: " + permission.permission);
    ActivityCompat.requestPermissions(this, new String[] { permission.permission }, permission.requestCode);
}

   public enum Permission {
         READ_CONTACTS(
            Manifest.permission.READ_CONTACTS,
            PERMISSIONS_REQUEST_READ_CONTACTS,
            R.string.permission_contacts_rationale_title,
            R.string.permission_contacts_rationale_message
    ),
    WRITE_CONTACTS(
            Manifest.permission.WRITE_CONTACTS,
            PERMISSIONS_REQUEST_WRITE_CONTACTS,
            R.string.permission_contacts_rationale_title,
            R.string.permission_contacts_rationale_message
    );

来自活动的 & 权限调用如下:

  private void checkAndRequestPermissions() {
    if (!hasPermission(Permission.READ_CONTACTS)) {
        requestPermissionOrShowRationale(Permission.READ_CONTACTS);
    }
}

当我使用targetsdk 23时,一切正常。将targetsdk更改为26或更高后,权限不起作用。除非我从应用程序权限设置中手动关闭和打开它以获取联系人。

标签: androidandroid-activityandroid-permissionsandroid-contactsruntime-permissions

解决方案


我为我的问题找到的超级简单和最佳解决方案是 TedPermission https://github.com/ParkSangGwon/TedPermission

我已经删除了所有现有的权限代码并使用了下面的魔法代码:)

  setLayout(R.layout.welcome);
    TedPermission.with(this)
            .setPermissionListener(permissionlistener)
            .setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)
            .setDeniedMessage("This permission is required to show Contact Pictures and Email Address Suggestions.\n\nPlease turn on this permissions at [Setting] > [Permission]")
            .check();

   PermissionListener permissionlistener = new PermissionListener() {
    @Override
    public void onPermissionGranted() {


        }

    }

    @Override
    public void onPermissionDenied(ArrayList<String> deniedPermissions) {
        Toast.makeText(WelcomeMessage.this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
    }
};

推荐阅读