首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >READ_CONTACTS权限不起作用,除非我手动关闭它&在android 23+上

READ_CONTACTS权限不起作用,除非我手动关闭它&在android 23+上
EN

Stack Overflow用户
提问于 2019-02-19 15:06:09
回答 2查看 576关注 0票数 1

我正在工作的应用程序,我需要一个用户联系图片显示,如果可用的话。

下面是询问read_contacts权限的代码:

代码语言:javascript
复制
  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
    );

&活动的权限调用如下:

代码语言:javascript
复制
  private void checkAndRequestPermissions() {
    if (!hasPermission(Permission.READ_CONTACTS)) {
        requestPermissionOrShowRationale(Permission.READ_CONTACTS);
    }
}

当我使用targetsdk 23时,一切都很好。将目标值更改为26或更高后,权限不起作用。除非我手动关闭它&打开应用权限设置来获取联系人。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-19 18:49:32

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

我已经删除了该权限的所有现有代码,并使用了以下魔术代码:)

代码语言:javascript
复制
  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();
    }
};
票数 0
EN

Stack Overflow用户

发布于 2019-02-20 10:01:12

在早期的Android版本中有一个"bug“,在这个版本中,一旦您在一个组中请求了单个权限,您就会自动获得整个组的权限。

因此,如果您的应用程序需要READ_CONTACTS + WRITE_CONTACTS,那么请求READ_CONTACTS许可就足够了。从Android 26开始,为了更好地反映文档,对此进行了修复,因此您需要询问您感兴趣的所有权限才能获得它们,所以代码如下:

代码语言:javascript
复制
new String[] { permission.permission }

应该有:

代码语言:javascript
复制
new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }

(如何用您拥有的enum实现这一点取决于您自己)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54769308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档