Android: странная вещь о загрузке контактной информации - PullRequest
2 голосов
/ 14 июля 2011

Я создал приложение. Он работает на htc desire hd, но когда я тестировал его на ZTE Blade, появилась странная проблема. В моем приложении, когда пользователь выбирает имя контакта из счетчика, появляется меню. В меню пользователь может отправить смс пользователю, позвонить ему или просто посмотреть его контактную информацию. На HTC Desire HD все работает нормально. В ZTE, кажется, есть проблема с кнопкой контактной информации: в некоторых случаях, когда пользователь выбирает контакт и хочет видеть его контактную информацию, отображается информация о каком-либо другом контакте. Поэтому я выбираю Пита из своего счетчика, но я получаю контактную информацию Дэйва. В других случаях я выбираю Тома из счетчика и получаю контактную информацию Тома. Проблема не существует на моем HTC. Я не мог понять, что вызывает проблему. Кстати, мой список контактов в HTC также заполняется из gmail и facebook, и приложение все еще работает нормально, в то время как список контактов ZTE никогда не видел учетных записей gmail или facebook (я не совсем уверен в этом).

Это код, который я использую, чтобы получить контактную информацию:

         infobtn.setOnClickListener(new View.OnClickListener() 
         {
            public void onClick(View v) 
            { 
                ContentResolver cr = getContentResolver();
                Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

                if (cur.getCount() > 0) 
                {

                    while (cur.moveToNext()) {
                    id_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                    name_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        if (name_contact.equals(name1))
                        {
                        Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id_contact}, null);
                           id_contact2 = id_contact;

                            while (pCur.moveToNext()){
                            } 
                        pCur.close();
                        }
                    }
                    Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + id_contact2));
                    startActivity(intent_contacts);
                }

            }
         });

Ответы [ 3 ]

0 голосов
/ 29 августа 2014

Вы можете увидеть эту ссылку, это очень хорошо: http://www.vtutorials.info/2014/08/working-with-android-contacts-how-to.html

private Map<Long, ArrayList<LocalContactInfo>> queryAllPhones(ContentResolver contentresolver)  
   {  
     HashMap<Long, ArrayList<LocalContactInfo>> hashmap = new HashMap<Long, ArrayList<LocalContactInfo>>();  
     Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;  
           String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;  
           String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;  
     Cursor cursor = contentresolver.query(PhoneCONTENT_URI, null, null, null, null);  
     do  
     {  
       if (!cursor.moveToNext())  
       {  
         cursor.close();  
         return hashmap;  
       }  
       long l = cursor.getLong(cursor.getColumnIndex(Phone_CONTACT_ID));  
       String s = cursor.getString(cursor.getColumnIndex(NUMBER));  
       LocalContactInfo temp = new LocalContactInfo(String.valueOf(l), "", s, "", 1);  
       if (hashmap.containsKey(Long.valueOf(l))){  
         ((List<LocalContactInfo>)hashmap.get(Long.valueOf(l))).add(temp);  
       } else{  
         ArrayList<LocalContactInfo> arraylist = new ArrayList<LocalContactInfo>();  
         arraylist.add(temp);  
         hashmap.put(Long.valueOf(l), arraylist);  
       }  
     } while (true);  
   } 

И:

 public List<LocalContactInfo> doloadContacts() {  
           List<LocalContactInfo> _return = new ArrayList<LocalContactInfo>();  
           Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;  
           String _ID = ContactsContract.Contacts._ID;  
           String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;  
           String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;  
           ContentResolver contentResolver = mContext.getContentResolver();  
           Map<Long, ArrayList<LocalContactInfo>> map = queryAllPhones(contentResolver);  
           Cursor cursor = contentResolver.query(CONTENT_URI, null,null, null, null);  
           if(cursor == null || cursor.getCount()==0){  
             return _return;  
        }  
           if (cursor.getCount() > 0) {  
                while (cursor.moveToNext()) {  
                     Long contact_id = cursor.getLong(cursor.getColumnIndex( _ID ));  
                     String fullname = cursor.getString(cursor.getColumnIndex( DISPLAY_NAME )).trim();  
                     int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex( HAS_PHONE_NUMBER )));  
                     if (hasPhoneNumber > 0 && map.get(contact_id) != null){  
                               Object obj = ((List<LocalContactInfo>)map.get(contact_id)).get(0);  
                               if(obj instanceof LocalContactInfo){  
                                    LocalContactInfo _temp = (LocalContactInfo)obj;  
                                    _return.add(new LocalContactInfo(String.valueOf(contact_id), fullname, _temp.getNumberPhone(), "",hasPhoneNumber));  
                               }  
                     }  
             }  
           }  
     return _return;  
      }  
0 голосов
/ 31 марта 2017

вместо использования "contacts / people / xxx", попробуйте использовать contactsContract.Contacts.CONTENT_URI.

в основном, вы хотите заменить.

Uri contactUri = Uri.parse("content://contacts/people/" + id_contact2)); 

на

Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, 
    id_contact2); 

Еще одна вещь, на которую следует обратить внимание, это то, что «id_contact2» может быть изменено, если перед его использованием происходит синхронизация (например, когда Google Sync объединяет контакт).Чтобы предотвратить это, лучше использовать вместо него LookupKey.

ContactsContract.Contacts.LOOKUP_KEY

и получить с помощью

Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, 
    yourContactLookupKey);
0 голосов
/ 29 ноября 2011

У меня похожие проблемы в моем приложении.Приложение представляет собой виджет, который дает возможность быстро использовать избранные контакты.Пользователь создает новый виджет и назначает ему контакт.Когда он нажимает на виджет, он может выполнять общие действия с контактами - звонить, отправлять смс, редактировать и т. Д.

Некоторые пользователи отправляют отчет, например, такой: «Я выбираю около 4 контактов, и приложение показывает 4, но только одноиз них правильные 3 других - тот же самый контакт, который я даже не выбрал ".«Почему неправильный контакт отображается при выборе? На моем дроиде невероятно»

Я не могу воспроизвести проблему на моей стороне.Я пробовал несколько разных устройств, пытался установить контакты импорта / экспорта - безрезультатно.

В любом случае, у меня есть некоторые идеи об источнике проблемы.

Мое приложение использует ключи поиска для хранения контактов, в соответствии с sdk .Поэтому, когда пользователь выбирает контакт, приложение сохраняет ключ поиска контакта.Затем он использует этот ключ поиска, чтобы получить идентификатор контакта для этого контакта.После этого он использует ТОЛЬКО полученный Contact ID во всех других функциях.Так ли ваша функция - она ​​использует только контактный идентификатор в подзапросе.

Вопрос: возможно ли, что разные контакты (с разными ключами поиска) имеют один и тот же контактный идентификатор?Похоже, что это возможно на некоторых устройствах в редких случаях ... Если это так, нам нужно использовать Contact ID + ключ поиска всегда вместе, чтобы идентифицировать контакт. ( update: предложение было неверным. Lookupключ может быть изменен после изменения контактной информации, вы не найдете контакт ).

Как я понимаю, вы можете воспроизвести проблему на вашей стороне.Я бы предложил изменить ваш код следующим образом:

     infobtn.setOnClickListener(new View.OnClickListener() 
     {
        public void onClick(View v) 
        { 
            ContentResolver cr = getContentResolver();
            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

            if (cur.getCount() > 0) 
            {

                while (cur.moveToNext()) {
                id_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                name_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String lookup_key = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                    if (name_contact.equals(name1))
                    {
                    Cursor pCur = cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ? AND " + ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY + " = ?", new String[]{id_contact, lookup_key}, null);
                       id_contact2 = id_contact;

                        while (pCur.moveToNext()){
                        } 
                    pCur.close();
                    }
                }
                Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + id_contact2));
                startActivity(intent_contacts);
            }

        }
     });

и попытаться воспроизвести проблему снова.

...