Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 阅读联系电话号码对某些人有效,而对其他人无效?_Android_Android Contacts_Phone Number - Fatal编程技术网

Android 阅读联系电话号码对某些人有效,而对其他人无效?

Android 阅读联系电话号码对某些人有效,而对其他人无效?,android,android-contacts,phone-number,Android,Android Contacts,Phone Number,我正在安卓系统中从联系人列表中读取联系人姓名和电话号码。我正在成功地读名字。但是,当我按姓名查找联系人电话号码时(在本例中都是唯一的,这只是一个测试),它只适用于一个联系人,其他人没有电话号码,一个联系人的电话号码是错误的 下面是我的getNumbers方法中的代码: private String getNumber(String name){ String returnMe=""; ContentResolver contentResolver = getContentReso

我正在安卓系统中从联系人列表中读取联系人姓名和电话号码。我正在成功地读名字。但是,当我按姓名查找联系人电话号码时(在本例中都是唯一的,这只是一个测试),它只适用于一个联系人,其他人没有电话号码,一个联系人的电话号码是错误的

下面是我的getNumbers方法中的代码:

private String getNumber(String name){
    String returnMe="";
    ContentResolver contentResolver = getContentResolver();
    Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null,
            "DISPLAY_NAME = '" + getIntent().getStringExtra("name") + "'", null, null);

    if(cursor.moveToFirst()){
        String identifier = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, ContactsContract.CommonDataKinds.Phone._ID + " = " + identifier, null, null);
        while(phones.moveToNext()){
            returnMe = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            int type = phones.getInt(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
            switch(type){
                case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
                    System.out.println("mobile number found"); break;
                default:
                    System.out.println("nothing found."); break;
            }
        }
    }
    return returnMe;
}
请看我的回答:

ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
    String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
        //Query phone here
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
        Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
        new String[]{id}, null);
        while (pCur.moveToNext()) {
        // Get phone numbers here
        } 
        pCur.close();
    }
  }
 }
}

你做错了几件事:

1) 第二个查询的目标必须是表,而不是电话表:

Cursor phones = contentResolver.query(ContactsContract.Data.CONTENT_URI, ...
并在where子句的DATA1列中指定您想要的电话号码:

Data.MIMETYPE = Phone.CONTENT_ITEM_TYPE
2) 您需要按RawContact的_ID筛选结果

这将联系人行的_ID与电话行的_ID进行比较,两者几乎不可能相同:

ContactsContract.CommonDataKinds.Phone._ID + " = " + identifier
这会将Data.CONTACT_ID与光标的CONTACT._ID属性进行比较

Data.CONTACT_ID + " = " + identifier
javadoc页面上的示例提供了一个更完整的示例:

查找给定联系人的给定类型的所有数据


谢谢你的样品,但我真的对学习而不是破译感兴趣。你能给我解释一下你在做什么,为什么你这样做而不是另一个吗?它多次给我相同的联系方式。很高兴我能帮上忙。事实上,我认为另一个答案也适用,并且只使用联系人表,因此更简单。联系人组织在3个表中:联系人、原始联系人和数据。每个表都有一个对应的类,例如Contacts contract.Contacts。然后需要使用适当的键连接结果,就像在SQL查询中一样。确保你读了所有这些文件。
Cursor c = getContentResolver().query(Data.CONTENT_URI,
      new String[] {Data._ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL},
      Data.CONTACT_ID + "=?" + " AND "
              + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'",
      new String[] {String.valueOf(contactId)}, null);