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

2023-11-27

我想检查新的权限模型如何工作,因此在应用程序的设置中我禁用Contacts。然后我进入应用程序并尝试阅读Contacts而且......它有点起作用:

try {
    Uri result = data.getData();
    int contentIdx;
    cursor = getContentResolver().query(result, null, null, null, null);
    contentIdx = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
    if(cursor.moveToFirst()) {
        content = cursor.getInt(contentIdx);
    }

    if(content > 0) {
        contentIdx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        if(cursor.moveToFirst()) {
            name = cursor.getString(contentIdx);
        }
        contentIdx = cursor.getColumnIndex(BaseColumns._ID);
        if(cursor.moveToFirst()) {
            content = cursor.getLong(contentIdx);
        }
        cursor = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] { Phone.NUMBER }, Data.CONTACT_ID + "=?", new String[] { String.valueOf(content) }, null);
        if(cursor.moveToFirst()) {
            number = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
        }
    }
} catch (Exception e) {
    //SecurityException
}
  • 我能够读取联系人的姓名
  • 当我尝试读取联系人号码时SecurityException被抛出

java.lang.SecurityException:权限拒绝:从 pid=20123、uid=10593 读取 com.android.providers.contacts.HtcContactsProvider2 uri content://com.android.contacts/data/phones 需要 android.permission.READ_CONTACTS 或 grantUriPermission ()

这是为什么?

相关内容:通过挑选活动泄露联系人数据


Android Marshmallow 有新的权限系统。 您需要在运行时请求权限,使用如下代码 - 我从此处复制了其中的一部分http://developer.android.com/training/permissions/requesting.html

@Override public void onClick(View v) {
    switch (v.getId()){
        case R.id.tv_contact:{
            askForContactPermission();
            break;
        }
    }  }

private void getContact(){
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT); }

 public void askForContactPermission(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {

            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                    Manifest.permission.READ_CONTACTS)) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle("Contacts access needed");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setMessage("please confirm Contacts access");//TODO put real question
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @TargetApi(Build.VERSION_CODES.M)
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        requestPermissions(
                                new String[]
                                        {Manifest.permission.READ_CONTACTS}
                                , PERMISSION_REQUEST_CONTACT);
                    }
                });
                builder.show();
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions(getActivity(),
                        new String[]{Manifest.permission.READ_CONTACTS},
                        PERMISSION_REQUEST_CONTACT);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }else{
            getContact();
        }
    }
    else{
        getContact();
    } }

@Override public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CONTACT: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getContact();
                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {
                ToastMaster.showMessage(getActivity(),"No permission for contacts");
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    } }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何停止 C# winforms 闪烁

    我有一个程序 本质上就像一个绘画应用程序 但是 我的程序存在一些闪烁问题 我的代码中有以下行 应该消除闪烁 但没有 this SetStyle ControlStyles AllPaintingInWmPaint ControlStyles
  • MySQL 更新花费(太)长时间

    在我们的服务出现预期的增长之后 突然有些更新需要非常长的时间 这些更新过去非常快 直到表达到大约 2MM 记录 现在每个更新大约需要 40 60 秒 update table1 set field1 field1 1 where id 22
  • 带有两个文本字段和两个按钮的 UIAlertView

    Problem 我想要一个 UIAlertView 其中包含一个标题 两个带占位符的文本字段和两个按钮 到目前为止我做了什么 我已经使用了这段代码 我得到了精确的 UIAlertView 以及我提到的所有这些 但是当视图加载时 它似乎首先出
  • Mac 应用商店产品构建

    Apple s 有关向 Mac App 商店提交应用程序的文档包含 Developer usr bin 中的命令 Productbuild 的使用示例 productbuild component build Release Sample
  • 从资源中绘制位图到另一个资源上

    我有两个位图 背景 and 前景 如何在不使用其他画布的情况下在背景上绘制位图前景 解决方案 1 首先使用附加选项 ARGB 8888 从资源创建位图 BitmapFactory Options options new BitmapFact
  • 为什么这个基本的 Node.js 错误处理不起作用?

    Node js var https require https var request https get google com function response console log response statusCode reque
  • Perl 用逗号分隔列表,除非在括号内?

    我有一个数据库 其中包含许多包含逗号分隔值的字段 我需要在 Perl 中拆分这些字段 这很简单 只是有些值后面是包含在我不想拆分的括号中的嵌套 CSV Example recycling environmental science inte
  • 如何在 Spring-MVC Eclipse 项目中包含 jQuery 库

    再会 我进行了广泛的搜索 但我所能找到的只是有关如何向 Eclipse 添加各种插件的信息 我不想要插件 我想要我的臭 jQuery 我尝试过的一些事情 我下载 jQuery 并将其放入我的 WebContent WEB INF js 文件
  • 将 Spark 数据帧写入 postgres 数据库

    Spark集群设置如下 conf SparkConfiguration SparkConf setMaster yarn client setAppName test set spark executor memory 20g set sp
  • 在 Python 中使用 Angular JS(量角器)和 Selenium

    我正在尝试选择一个包含在中的文本区域角度 1 using selenium 但在 DOM 中看不到 有一个模块叫皮拖拉机 我一直在尝试解决这个问题 但无法正确使用它 谁能帮我这个 您还可以使用常规的 selenium 绑定来测试 Angul
  • 有没有一种简单的方法将 NSString 拆分为字符数组?

    有没有一种简单的方法将 NSString 拆分为字符数组 如果结果类型是 NSString 本身的集合 每个只有一个字符 那实际上是最好的 是的 我知道我可以在循环中执行此操作 但我想知道是否有一种更快的方法可以使用任何现有方法或函数执行此
  • C++ 表达式必须具有常量值

    include
  • Virtualenvs 中的引用损坏

    我最近在我的 Mac 上安装了一堆点文件以及一些其他应用程序 我更改为 iTerm 而不是 Terminal 并将 Sublime 作为我的默认文本编辑器 但从那以后 我的所有虚拟环境都停止工作 尽管它们的文件夹位于 virtualenvs
  • 在 Android 日历中插入多个事件

    我无法找到问题的解决方案 我正在尝试将多个事件添加到我的 Android 日历中 但我不知道如何操作 我找到了这段代码 Calendar cal Calendar getInstance Intent intent new Intent I
  • R:将数据帧转换为表

    我在 R 中有一个数据框 其中包含三个变量 例如df V1 df V2 df V3 df V1 and df V2都是因素 而df V3是数字 df lt data frame V1 letters 1 4 V2 rep LETTERS 1
  • 性能:绝对 URL 与相对 URL

    什么更快 热链接 内联链接 to an 绝对URI或自己托管资源并使用相对URI In his 有关如何在 Internet Explorer 中设置 HTML5 元素样式的教程 Remy Sharp 指出热链接会导致 额外的 HTTP G
  • 将破折号图嵌入到 html 中

    我想将 Plotly 图表嵌入到我自己的 html 文件中 使用 Dash 我可以在 API 本地服务器中生成相同的图表 但是对于我自己的 HTML 文件 我没有得到任何解决方案 我的达世币解决方案 import dash import d
  • jQuery $.ajax() 功能 - 访问 XMLHttpRequest 对象

    是否可以访问XMLHttpRequest来自成功回调的对象 ajax 功能 具体来说 我需要访问XMLHttpRequest responseBody在IE中 根据文档返回的jqXHR对象不暴露 responseBody财产 这似乎是一个很
  • JasperReports:如何创建一个以多个值作为输入的参数

    我有一份报告 其中可能会为名为的参数传递多个值Product Type 这样我的查询就会变成这样 Select Id name from temp where product type IN prod1 prod2 prod3 你应该产品类
  • Android 6.0 (Marshmallow) READ_CONTACTS 权限允许在权限被拒绝时读取联系人姓名

    我想检查新的权限模型如何工作 因此在应用程序的设置中我禁用Contacts 然后我进入应用程序并尝试阅读Contacts而且 它有点起作用 try Uri result data getData int contentIdx cursor