2017-01-11 2 views
1

Я работаю над приложением, которое включает также работу с контактами. Я пробовал отличные методы, но никто из них не работал. Я получаю контактные данные в одном из фрагментов фрагментов с вкладками. Его правильная выборка всех других деталей, кроме Email Address контакта. Я выяснил причину, потому что ContactsContract.CommonDataKinds.Phone._ID извлекает разные идентификаторы, чем ContactsContract.CommonDataKinds.Email.CONTACT_ID. Теперь, что я должен кодировать для извлечения всех контактов с телефона вместе с name, number, email, photo_uri. Пожалуйста помоги! Вот мой кусок кода:Получение нулевого значения при получении адреса электронной почты контакта

public class FragmentContacts extends Fragment{ 

ListView contacts; 
ArrayList<String> namelist=new ArrayList<String>(); 
ArrayList<String> number=new ArrayList<String>(); 
ArrayList<String> contact_id=new ArrayList<String>(); 
ArrayList<String> contact_image_uri=new ArrayList<String>(); 
ArrayList<String> contact_email=new ArrayList<String>(); 
String[] sortImage; 
ImageButton addContact; 
String email; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_contacts, container, false); 
    contacts=(ListView)rootView.findViewById(R.id.contact_list); 
    addContact=(ImageButton)rootView.findViewById(R.id.add_contact); 
    namelist.clear(); 
    getContacts(); 

    addContact.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      addNewContact(); 
     } 
    }); 
    return rootView; 
} 


public void getContacts() { 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 

    Cursor managedCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.PHOTO_URI}, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC"); 

    while (managedCursor.moveToNext()) { 

     String id = managedCursor.getString(0); 
     String name = managedCursor.getString(1); 
     String phoneNumber = managedCursor.getString(2); 
     String image_uri=managedCursor.getString(3); 
     //email=managedCursor.getString(4); 
     email=getEmail(id); 
     System.out.println("Email is "+email); 
     contact_id.add(id); 
     // System.out.println("Id is "+id+" "+"Name is "+name); 
     namelist.add(name); 
     number.add(phoneNumber); 
     contact_image_uri.add(image_uri); 
     contact_email.add(email); 
    } 
    managedCursor.close(); 



    ContactAdapter a = new ContactAdapter(getActivity(), contact_id, namelist, number,contact_image_uri,contact_email); 
    contacts.setAdapter(a); 
} 


public void addNewContact() 
{ 
    Intent in= new Intent(getContext(),AddContact.class); 
    startActivity(in); 
} 

private String getEmail(String contactId) { 

    String mailE=null; 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 
    Cursor cursor = cr.query(
      ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Email.CONTACT_ID +" = ?", 
      new String[]{contactId}, null); 

    while (cursor.moveToNext()) 
    { 
     mailE=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 
     System.out.println("In Between Email is "+mailE); 
    } 

    cursor.close(); 
    return mailE; 
} 
} 
+0

Пробовали ли вы это SO ссылка http://stackoverflow.com/questions/10117049/get-only-email-address-from- contact-list-android –

+0

http://stackoverflow.com/questions/25717989/cannot-retrieve-email-from-contacts – kgandroid

+1

Возможный дубликат [Получить только адрес электронной почты из списка контактов Android] (http://stackoverflow.com/ вопросы/10117049/get-only-email-address-from-contact-list-android) – Spartan

ответ

0

И наконец, я решил это. Я изменил contact_id от ContactsContract.CommonDataKinds.Phone._ID к ContactsContract.CommonDataKinds.Phone.CONTACT_ID ... Мой Обновленный код:

public class FragmentContacts extends Fragment{ 

ListView contacts; 
ArrayList<String> namelist=new ArrayList<String>(); 
ArrayList<String> number=new ArrayList<String>(); 
ArrayList<String> contact_id=new ArrayList<String>(); 
ArrayList<String> contact_image_uri=new ArrayList<String>(); 
ArrayList<String> contact_email=new ArrayList<String>(); 
ImageButton addContact; 
String email; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_contacts, container, false); 
    contacts=(ListView)rootView.findViewById(R.id.contact_list); 
    addContact=(ImageButton)rootView.findViewById(R.id.add_contact); 
    namelist.clear(); 
    getContacts(); 

    addContact.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      addNewContact(); 
     } 
    }); 
    return rootView; 
} 


public void getContacts() { 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 

    Cursor managedCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.PHOTO_URI}, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC"); 


    while (managedCursor.moveToNext()) { 

     String id = managedCursor.getString(0); 
     String name = managedCursor.getString(1); 
     String phoneNumber=managedCursor.getString(2); 
     String image_uri=managedCursor.getString(3); 
     email=getEmail(id); 
     contact_id.add(id); 
     namelist.add(name); 
     number.add(phoneNumber); 
     contact_image_uri.add(image_uri); 
     contact_email.add(email); 
    } 
    managedCursor.close(); 

    ContactAdapter a = new ContactAdapter(getActivity(), contact_id, namelist, number,contact_image_uri,contact_email); 
    contacts.setAdapter(a); 
} 


public void addNewContact() 
{ 
    Intent in= new Intent(getContext(),AddContact.class); 
    startActivity(in); 
} 

private String getEmail(String contactId) { 

    String mailE=null; 
    ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); 
    Cursor cursor = cr.query(
      ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Email.CONTACT_ID +" = ?", 
      new String[]{contactId}, null); 

    while (cursor.moveToNext()) 
    { 
     mailE=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 
    } 

    cursor.close(); 
    return mailE; 
} 

} 
0

Для Получение электронной почты на адрес электронной почты,

String email = managedCursor .getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

Попробуйте это.

+0

i'v уже пробовал с 'DATA' также .. все тот же результат –

+0

он бросает любое исключение .. –

+0

Попробуйте так http://stackoverflow.com/a/11669474/3514144 –

0

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

public ArrayList<String> getEmail() { 
     ArrayList<String> names = new ArrayList<String>(); 
     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)); 
       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)); 
        Log.e("Name :", name); 
        String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
        Log.e("Email", email); 
        if(email!=null){ 
         names.add(name); 
        } 
       } 
       cur1.close(); 
      } 
     } 
     return names; 
    } 
0

Там какая-то путаница в вашем коде, вы не можете запросить более Phone.CONTENT_URI и ожидать, чтобы получить по электронной почте-адрес, так как электронные письма хранятся в Email.CONTENT_URI.

Наилучшим способом было бы добавить еще один запрос по Email.CONTENT_URI, но это не нужно, ваш лучший выбор - это запросить всю таблицу Data.CONTENT_URI, которая содержит как электронные письма, так и телефоны (и множество других типов информации) и попросите только mimetypes для писем и телефонов.

String[] projection = new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Email.ADDRESS, Phone.NUMBER }; 
Cursor cur = getContentResolver().query(Data.CONTENT_URI, projection, Data.MIMETYPE + " IN ('" + Email.CONTENT_ITEM_TYPE + "' , '" + Phone.CONTENT_ITEM_TYPE +"')", null, null); 

while ((cur != null) && cur.moveToNext()) { 
    long contactId = cur.getLong(0); 
    String name = cur.getString(1); 
    String type = cur.getString(2); 
    String email = null; 
    String phone = null; 
    if (type == Email.CONTENT_ITEM_TYPE) { 
     email = cur.getString(3); 
    } else { 
     phone = cur.getString(4); 
    } 
    // do whatever you want with above variables. 
} 

Примечание: вы получите тот же contactId и name для каждого телефона/электронной почты, сохраненной для этого контакта, так что вы должны использовать HashMap для отображения ContactId в список деталей, для того, чтобы сохранить все это данные.

Обязательно прочитайте сначала документы об ContactsContract API и Contacts и Data таблицах, так как они имеют решающее значение для понимания того, как запрашивать информацию о контактах.

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