2013-03-06 3 views
3

Я пытаюсь получить адрес электронной почты из ContactsContract, но я получаю только пустую строку! Имя и номер работают нормально, но не адрес электронной почты!Не удается получить адрес электронной почты от ContactsContract

Я смутился и пытался решить это в течение нескольких дней, но я не знаю, что случилось, если я пропустил что-то в коде или что и не знаю, как это решить.

Эта часть приложения имеет список всех имен из ContactsContract. При выборе имени в списке, код должен получить имя, номер и адрес электронной почты из ContactContract.

Я бы рекомендовал некоторую помощь, чтобы иметь возможность продолжить работу! Возможно, есть лучший способ решить это, тогда, пожалуйста, скажите мне, как измениться! Благодаря!

Поскольку сообщение тоста не отображается внутри цикла while, while(cursorEmail.moveToFirst()){.... Я предполагаю, что что-то не так с курсором электронной почты !? Кажется, он пуст !?

public class Activity_3 extends Activity { 

ListView listView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_3); 
    listView = (ListView) findViewById(R.id.contactList); 

    String[] projection = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.CommonDataKinds.Phone._ID }; 

    Cursor cursor1 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null); 

    // From column 
    String[] fromColumn = { ContactsContract.Contacts.DISPLAY_NAME }; 
    // To view 
    int[] toView = { R.id.contactItem }; 

    startManagingCursor(cursor1); 

    ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.activity_3, cursor1, fromColumn, toView); 

    listView.setAdapter(adapter); 

    listView.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { 

      String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, 
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
        ContactsContract.CommonDataKinds.Phone.NUMBER, 
        }; 

      Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null); 

      cursor.moveToPosition(position); 

      String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

      String pos = Integer.toString(position); 

      String contactEmailAddress = "?"; 
      //Email 
      Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null); 

      while(emails.moveToNext()){ 
       contactEmailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
       Toast.makeText(Activity_3.this, contactEmailAddress, Toast.LENGTH_SHORT).show(); 
      } 
      emails.close(); 

      Toast.makeText(Activity_3.this, pos + " " + contactId + " " + contactName + " " + contactNumber + " " + contactEmailAddress, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

}

ответ

11

Вам необходимо получить список контактов с информацией по следующему коду. Следующий способ возвращает все контакты с именем, номером телефона и электронной почтой.

public ArrayList<ContactDO> getContacts() 
{ 
    ArrayList<ContactDO> alContacts = null; 
    Cursor cursor = contResv.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if(cursor.moveToFirst()) 
    { 
     alContacts = new ArrayList<ContactDO>(); 
     do 
     { 
      //Create a plain class with following variables - id, name, contactNumber, email 
      ContactDO objContactDO = new ContactDO(); 

      objContactDO.name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));  
      objContactDO.id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

      Cursor emails = contResv.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + objContactDO.id, null, null); 
      while (emails.moveToNext()) 
      { 
       objContactDO.email = emails.getString(emails.getColumnIndex(Email.DATA)); 
       break; 
      } 
      emails.close(); 

      if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
      { 
       Cursor pCur = contResv.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ objContactDO.id }, null); 
       while (pCur.moveToNext()) 
       { 
        objContactDO.contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        break; 
       } 
       pCur.close(); 
      } 

      alContacts.add(objContactDO); 

     } while (cursor.moveToNext()) ; 
    } 

    cursor.close(); 
    return alContacts; 
} 

Создайте пользовательский адаптер и установите его в listview.

lvContacts.setAdapter(adapter = new CustomContactsAdapter(getContacts())); 
+0

Спасибо, это мне очень полезно .. –

+0

Блестяще, спасибо! Эта информация была сложнее найти, чем я думал изначально. –

+0

Большое спасибо за этот код. Это спасло мою жизнь, пытаясь найти что-то точно такое же. – JPerk

2

Предполагая, что у вас есть идентификатор для конкретного контакта, которую Вы собираетесь получить адрес электронной почты для, вот фрагмент кода я сделал некоторое время назад, когда я пытался сделать так же, как вы сейчас:

Сначала вы будете хотеть, чтобы получить идентификатор для контакта:

ContentResolver cr = context.getContentResolver(); 
    Cursor cursor  = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    id     = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

Тогда вы можете получить адрес электронной почты, делая это:

  String contactAddress = ""; 
      Cursor cursorEmail  = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
              null, 
              ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
              new String[] {id}, 
              null); 
      if(cursorEmail.moveToFirst()) { 
       contactAddress = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
      } 

Помните, что контакт не обязательно по электронной почте, так что вы должны конечно принять во внимание :-)

Edit: Взял лучший взгляд на ваш код и сравнить его с тем, что я имею здесь. Кажется, что ваша проблема заключается в параметрах selection и selectionArgs. То, что вы хотите сделать, это получить идентификатор контакта вы получаете адрес электронной почты для, а затем изменить свой выбор на:

ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?" 

и добавить идентификатор в selectionArgs, как это:

new String[] {id} 
+0

Привет!Но я получаю красную линию ниже id? –

+0

и что говорит красная линия, когда вы наводите на нее курсор мыши? – RvdK

+0

Тип несоответствие: не может преобразовать из long в String –

0

Здесь я отправляю рабочий метод, который вернет вам идентификатор почты или null (если недоступно) идентификатором контакта.

public static String getEmail(Context c, long id) { 
     Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI; 
     String[] projection = new String[] { 
       ContactsContract.CommonDataKinds.Email._ID, 
       ContactsContract.CommonDataKinds.Email.CONTACT_ID, 
       ContactsContract.CommonDataKinds.Email.ADDRESS, 
       ContactsContract.CommonDataKinds.Email.TYPE }; 
     String selection = ContactsContract.CommonDataKinds.Email.CONTACT_ID 
       + " = '" + id + "'"; 
     String sortOrder = ContactsContract.CommonDataKinds.Email.ADDRESS 
       + " COLLATE LOCALIZED ASC"; 

     Cursor cursor = c.getContentResolver().query(uri, projection, 
       selection, null, sortOrder); 

     int index = cursor 
       .getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS); 
     if (cursor.moveToNext()) { 
      return cursor.getString(index); 
     } 
     return null; 
    } 
0
ContentResolver cr = this.getContext().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)); 
     Cursor cur1 = cr.query( 
       ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 
       ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
         new String[]{id}, null); 
     while (cur1.moveToNext()) { 
      //to get the contact names 
      String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 



     } 
     cur1.close(); 
    } 
} 
0

использование этого

String email = ""; 
      try { 
       Uri result = data.getData(); 
       Log.v(DEBUG_TAG, "Got a contact result: " 
         + result.toString()); 
       // get the contact id from the Uri 
       String id = result.getLastPathSegment(); 
       // query for everything email 
       cursor = getContentResolver().query(Email.CONTENT_URI, 
         null, Email.CONTACT_ID + "=?", new String[] { id }, 
         null); 
       int emailIdx = cursor.getColumnIndex(Email.DATA); 
       // let's just get the first email 
       if (cursor.moveToFirst()) { 
        email = cursor.getString(emailIdx); 
        Log.v(DEBUG_TAG, "Got email: " + email); 
       } else { 
        Log.w(DEBUG_TAG, "No results"); 
       } 
      } catch (Exception e) { 
       Log.e(DEBUG_TAG, "Failed to get email data", e); 
      } finally { 
       if (cursor != null) { 
        cursor.close(); 
       } 

       edtCustomerEmailid.setText(email); 

       //Toast.makeText(getApplicationContext(), email, 1).show(); 
       if (email.length() == 0) { 
        Toast.makeText(this, "No email found for contact.", 
          Toast.LENGTH_LONG).show(); 
       } 
      } 
Смежные вопросы