2017-01-11 5 views
1

연락처를 다루는 응용 프로그램을 만들고 있습니다. 나는 다른 방법을 시도했다. 그러나 그들 중 누구도 일하지 않았다. 나는 탭핑 된 활동 단편 중 하나에서 연락처 세부 사항을 가져왔다. 연락처의 전자 메일 주소를 제외한 다른 모든 세부 정보를 올바르게 가져옵니다. 나는 이 ContactsContract.CommonDataKinds.Email.CONTACT_ID이 아닌 다른 ID를 가져 오는 이유를 알아 냈습니다. name, number, email, photo_uri과 함께 전화에서 모든 연락처를 가져 오려면 어떻게해야합니까? 도와주세요! 이메일 주소 이메일을 얻기 위해연락처의 이메일 주소를 가져 오는 동안 null을 얻습니다.

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

마지막으로 해결했습니다. 내가 ... ContactsContract.CommonDataKinds.Phone.CONTACT_IDContactsContract.CommonDataKinds.Phone._ID에서 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

과 같이 커서 객체를 사용해보십시오. 'DATA'도 시도했습니다. 여전히 동일한 결과입니다. –

+0

예외를 던집니다. .. –

+0

다음과 같이 시도해주세요. http://stackoverflow.com/a/11669474/3514144 –

0

이 방법으로 해당 연락처의 전자 메일 ID를 가져올 수 있습니다. 귀하의 경우 연락 정보를 직접 전달할 수 있습니다. 코드에서 약간의 혼동이있다

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 테이블 전체를 쿼리하는 것이 가장 좋습니다. 이메일과 전화에 대해서만 mimetype을 요구하십시오.

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. 
} 

참고 : 해당 연락처에 저장된 각 전화/이메일 같은 contactIdname를 얻을 수 있습니다, 그래서 당신은이 모든 것을 저장하기 위해, 세부 사항의 목록에 contactId를지도하는 HashMap를 사용한다 데이터.

ContactsContract API와 ContactsData 테이블에 대해서는 처음으로 읽어야합니다. 이는 연락처 정보를 쿼리하는 방법을 이해하는 데 중요합니다.