【问题标题】:Getting null while fetching email address of a Contact获取联系人的电子邮件地址时为空
【发布时间】:2017-01-11 20:27:21
【问题描述】:

我正在开发一个包含处理联系人的应用程序。我尝试了不同的方法,但它们都没有奏效。我正在其中一个选项卡式活动片段中获取联系方式。它可以正确获取除联系人的电子邮件地址之外的所有其他详细信息。我已经找到了原因,因为 ContactsContract.CommonDataKinds.Phone._ID 获取的 ID 与 ContactsContract.CommonDataKinds.Email.CONTACT_ID 不同。现在我应该编写什么代码来从手机中获取所有联系人以及 namenumberemailphoto_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;
}
 }

【问题讨论】:

标签: android android-contacts


【解决方案1】:

用于获取电子邮件地址电子邮件,

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

试试这个。

【讨论】:

    【解决方案2】:

    您可以通过此方法获取该联系人的电子邮件 ID。在您的情况下,您可以直接传递联系人 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;
        }
    

    【讨论】:

      【解决方案3】:

      您的代码有些混乱,您无法通过 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.
      }
      

      注意:对于为该联系人存储的每个电话/电子邮件,您将获得相同的 contactIdname,因此您应该使用 HashMap 将 contactId 映射到详细信息列表,以便存储所有这些数据。

      您绝对应该首先阅读有关ContactsContract API 以及ContactsData 表的文档,因为这些对于了解如何查询有关联系人的信息至关重要。

      【讨论】:

        【解决方案4】:

        我终于解决了。我已将 contact_idContactsContract.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;
        }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多