2015-06-08 3 views
1

Я использую следующий фрагмент кода, чтобы получить телефонные номера контакта по контактному IDЧастые запросы на андроид контакты возвращает нулевую

private static ArrayList<PhoneName> getPhonesFromID(Context context, 
      String contactID, String column) { 
     // Run query 
     Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
     String[] projection = new String[] { 
       ContactsContract.CommonDataKinds.Phone._ID, 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
       ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Phone.NUMBER, 
       ContactsContract.CommonDataKinds.Phone.STARRED, 
       ContactsContract.CommonDataKinds.Phone.TYPE }; 
     String selection = column + " = '" + contactID + "'"; 
     String[] selectionArgs = null; 
     String sortOrder = ContactsContract.CommonDataKinds.Phone.NUMBER 
       + " COLLATE LOCALIZED ASC"; 

     Cursor cursor = context.getContentResolver().query(uri, projection, 
       selection, selectionArgs, sortOrder); 

     if (cursor == null) 
      return null; 

     int numberIndex = cursor 
       .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
     int nameIndex = cursor 
       .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
     int typeIndex = cursor 
       .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); 
     int favIndex = cursor 
       .getColumnIndex(ContactsContract.CommonDataKinds.Phone.STARRED); 

     ArrayList<PhoneName> phones = new ArrayList<PhoneName>(); 
     while (cursor.moveToNext()) { 
      PhoneName pn = new PhoneName(); 
      pn.name = cursor.getString(nameIndex); 
      pn.number = cursor.getString(numberIndex); 
      pn.starred = cursor.getString(favIndex); 
      pn.state = DataHelper.getInstance(context) 
        .getSubscriptionStateByNumber(pn.number); 
      Log.d("Number", pn.number); 
      int type = cursor.getInt(typeIndex); 
      if (type == ContactsContract.CommonDataKinds.Phone.TYPE_HOME) { 
       pn.type = "Home"; 
      } else if (type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) { 
       pn.type = "Mobile"; 
      } else if (type == ContactsContract.CommonDataKinds.Phone.TYPE_WORK) { 
       pn.type = "work"; 
      } else { 
       pn.type = "other"; 
      } 
      phones.add(pn); 
     } 

     cursor.close(); 
     return phones; 
    } 

Вот PhoneName мой самостоятельно определить класс для хранения контактной информации этого специфического контакт. Эта функция вызывается как:

getPhonesFromID(context, _id, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 

Я правильно получать контактную информацию, но вот проблема, иногда эта функция возвращает нулевое значение, когда я делаю частые запросы. Когда эта проблема возникает, по умолчанию люди приложения моего андроида также не показывают никакого контакта. Все контакты, как исчезли. Затем, если я закрою свое приложение и перезагрузится, он отобразит все контакты, как раньше. Затем снова, когда я перехожу к контактным данным контакта из моего приложения, он работает нормально несколько раз, а затем все контакты исчезают снова. Это странная проблема, и я не знаю, что здесь происходит. Я дважды проверял свои запросы и не мог понять, что здесь не так.

+0

где вы используете этот метод? можете ли вы опубликовать использование? – giorashc

+0

Я делаю приложение, как телефонную книгу. Сначала он заполняет все контакты, а затем, щелкая по каждому контакту, он переходит к другому фрагменту, отображающему детали этого конкретного контакта. –

ответ

1

И, наконец, эта проблема решена.

Как я уже сказал, мое приложение напоминает Телефонную книгу, и мне нужно было показать любимый значок для каждого контакта в списке, который является моим любимым контактом. В моем случае у меня была функция, например isFavourite(), чтобы определить, находится ли контакт в моем любимом списке или нет, и это вызывается каждый раз, когда загружается строка контакта.

Каждый раз, когда я открываю курсор, чтобы получить результат запроса, было обнаружено, что курсор не был закрыт нигде. Так что в принципе, закрытие курсора правильно решило проблему! Ура!

 Смежные вопросы

  • Нет связанных вопросов^_^