在没有READ_CONTACTS权限的情况下从联系人列表中获取所选电话号码

时间:2014-04-23 12:26:44

标签: android android-intent android-contacts android-permissions

在我的应用程序中,我希望用户可以通过手动输入或从联系人列表中选择电话号码来填写带有电话号码的文本表单。我不明白的一件事是,如果用户自己选择联系,我应该设置READ_CONTACTS权限。我使用下面列出的代码:

  1. 要启动通讯录活动:

    Intent pickContactIntent = new Intent(Intent.ACTION_PICK,
                                     ContactsContract.Contacts.CONTENT_URI);
    pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST_CODE);
    
  2. 处理来自Intent的{​​{1}}数据:

    onActivityResult
  3. 据我了解Uri uri = data.getData(); if (uri != null) { Cursor c = null; try { c = getContentResolver() .query( uri, new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE }, null, null, null); if (c != null && c.moveToFirst()) { String number = c.getString(0); int type = c.getInt(1); showSelectedNumber(type, number); } } finally { if (c != null) { c.close(); } } } 需要getContentResolver().query()许可才能获取电话号码。

    我的问题:是否有可能以某种方式处理onActivityResult中没有READ_CONTACTS的Intent?

5 个答案:

答案 0 :(得分:3)

您实际上并不需要READ_CONTACTS。

Note: Before Android 2.3 (API level 9), performing a query on the Contacts Provider (like the one shown above) requires that your app declare the READ_CONTACTS permission (see Security and Permissions). However, beginning with Android 2.3, the Contacts/People app grants your app a temporary permission to read from the Contacts Provider when it returns you a result. The temporary permission applies only to the specific contact requested, so you cannot query a contact other than the one specified by the intent's Uri, unless you do declare the READ_CONTACTS permission.

来源:http://developer.android.com/training/basics/intents/result.html

答案 1 :(得分:1)

不应该实际上需要READ_CONTACTS。 @Tony Chu是对的,文档说:

  

注意:在Android 2.3(API级别9)之前,对联系人提供程序执行查询(如上所示)需要您的应用程序声明READ_CONTACTS权限(请参阅安全性和权限)。但是,从Android 2.3开始,Contacts / People应用程序授予您的应用程序临时权限,以便在返回结果时从联系人提供程序中读取。临时权限仅适用于请求的特定联系人,因此除非您声明READ_CONTACTS权限,否则无法查询intent的Uri指定的联系人之外的联系人。 (Source

HOWEVER ,我注意到有些手机可能还需要它(根据我的经验,xperia设备以及@AVirvara的HTC设备)。

很抱歉,但似乎你没有其他选择。

答案 2 :(得分:0)

如果未在清单文件中授予READ_CONTACTS权限,则无法访问Android联系人dababase。

  

Android移动操作系统使用权限系统来帮助确保应用程序正常运行。该系统允许应用程序请求访问设备上可以使用电源,访问敏感数据并产生费用的功能。

答案 3 :(得分:0)

Yous应该在清单文件中写入权限,然后你只能从文件中读取联系人。

答案 4 :(得分:0)

无论是否在您的清单中放置权限,您都需要即时向用户请求该权限。

if( getApplicationContext().checkSelfPermission( Manifest.permission.READ_CONTACTS ) != PackageManager.PERMISSION_GRANTED ) ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, resultValue);

只有在获得批准后,您才能查询联系人电话号码/姓名等。