READ_CONTACTS 权限不起作用,除非我在 android SDK 23+ 上手动关闭和打开它

Posted

技术标签:

【中文标题】READ_CONTACTS 权限不起作用,除非我在 android SDK 23+ 上手动关闭和打开它【英文标题】:READ_CONTACTS permission is not working unless i manually turn it off & on on android SDK 23+ 【发布时间】:2019-07-13 03:17:59 【问题描述】:

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

下面是请求 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或更高后,权限不起作用。 除非我从应用权限设置手动关闭和打开它以获取联系人。

【问题讨论】:

【参考方案1】:

我为我的问题找到的超级简单和最好的解决方案是 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();
    
;

【讨论】:

【参考方案2】:

在较早的 android 版本中存在一个“错误”,在该错误中,一旦您在组内请求单个权限,您将自动获得整个组的权限。

因此,如果您的应用需要 READ_CONTACTS + WRITE_CONTACTS,那么请求 READ_CONTACTS 权限就足够了。 从 Android SDK 26 开始,此问题已得到修复,以更好地反映文档,因此您需要请求所有您感兴趣的权限才能获得它们,所以这段代码:

new String[]  permission.permission 

应该有:

new String[]  Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS 

(如何使用您的enum 实现此功能取决于您)

【讨论】:

以上是关于READ_CONTACTS 权限不起作用,除非我在 android SDK 23+ 上手动关闭和打开它的主要内容,如果未能解决你的问题,请参考以下文章

在 MIUI 中检查权限 READ_CONTACTS

除非涉及 endl,否则返回字符串的 C++ 函数不起作用...?

在 IIS 上使用 VS 2012 发布我的 asp.net mvc Web 应用程序不起作用,除非我在 VS 中运行 Web 应用程序

除非应用程序已经在运行,否则 URL 方案侦听器不起作用

Android 6.0 (Marshmallow) READ_CONTACTS 权限允许在权限被拒绝时读取联系人的姓名

如何在没有 READ_CONTACTS 权限的情况下获取 Android 联系人详细信息