【问题标题】:Getting null value while retrieving the CONTACT NAME from CONTACT EMAIL从 CONTACT EMAIL 检索 CONTACT NAME 时获取空值
【发布时间】:2016-08-10 13:47:10
【问题描述】:

我想从联系人电子邮件中检索联系人姓名,所以我所做的工作如下来自https://stackoverflow.com/a/18064869/5738881

 public static String readContacts(Context context, String email) {
    ContentResolver cr = context.getContentResolver();
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email));
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
    if (cursor == null) {
        return null;
    }
    String contactName = null;
    if (cursor.moveToFirst()) {
        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
    }

    if (!cursor.isClosed()) {
        cursor.close();
    }

    Log.e("....contact name....", email + "\n" + contactName);

    return contactName;

}

然后在onCreate()中,我编码为,

 sName = readContacts(getApplicationContext(), sEmail);

    etName.setText(sName);

但我得到的是空值。因此,仅根据联系人电子邮件地址获取联系人姓名的解决方案是什么?

EDIT-1:

我已经在清单中提到了权限,

<uses-permission android:name="android.permission.READ_CONTACTS"/>

EDIT-2:

根据 ROHIT SHARMA 的回答,我将代码更改如下。

 public static String readContacts(Context context, String email) {
    ContentResolver cr = context.getContentResolver();
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email));
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
    if (cursor == null) {
        return null;
    }
    String contactName = null;

    if (cursor.getCount() > 0) {
        cursor.moveToFirst();

    } else {
        return null;
    }

    if (cursor.moveToFirst()) {
        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
    }

    if (!cursor.isClosed()) {
        cursor.close();
    }

    Log.e("....contact name....", email + "\n" + contactName);

    return contactName;

}

但这对我也没有帮助。

EDIT-3:

public static String readContacts(Context context, String email) {
ContentResolver cr = context.getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email));
Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
String contactName = null;
if(cursor!=null && cursor.getCount()>0 )
{ 
 cursor.moveToFirst();
 contactName =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
}else{ 
   return null; 
} 
if (!cursor.isClosed()) {
    cursor.close();
} 

Log.e("....contact name....", email + "\n" + contactName);

return contactName;

}

这对我也没有帮助。

EDIT-4:

我试过了

 public String readContacts(Context context, String email) {

    String name = null;

    // define the columns I want the query to return
    String[] projection = new String[]{
            ContactsContract.PhoneLookup.DISPLAY_NAME,
            ContactsContract.PhoneLookup._ID};

    // encode the email and build the filter URI
    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email));

    // query time
    Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null);

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
            Log.e("....email.....", "Started uploadcontactphoto: Contact Found @ " + email);
            Log.e("....name....", "Started uploadcontactphoto: Contact name  = " + name);
        } else {
            Log.e("....email exception....", "Contact Not Found @ " + email);
        }
        cursor.close();
    }
    return name;

}

来自https://stackoverflow.com/a/15007980/5738881,但也没有帮助。

有人有其他出路吗?

EDIT-5:

public String readContacts() {

    ContentResolver cr = getContentResolver();

    @SuppressLint("Recycle")

    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, null);

    String id, name = null, email = null;

    if (cur != null && cur.getCount() > 0) {
        while (cur.moveToNext()) {
            id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                System.out.println("name : " + name + ", ID : " + id);

                // get the phone number
                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                        new String[]{id}, null);
                if (pCur != null) {
                    while (pCur.moveToNext()) {
                        String phone = pCur.getString(
                                pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        System.out.println("phone" + phone);
                    }
                }
                if (pCur != null) {
                    pCur.close();
                }


                // get email and type

                Cursor emailCur = cr.query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                        new String[]{id}, null);
                if (emailCur != null) {
                    while (emailCur.moveToNext()) {
                        // This would allow you get several email addresses
                        // if the email addresses were stored in an array
                        email = emailCur.getString(
                                emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        String emailType = emailCur.getString(
                                emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));


                        System.out.println("Email " + email + " Email Type : " + emailType);
                    }

                    if (email == sEmail) {
                        sName = name;
                    }

                }
                if (emailCur != null) {
                    emailCur.close();
                }
            }
        }
    }
    return name;
}

我从http://www.coderzheaven.com/2011/06/13/get-all-details-from-contacts-in-android/ 尝试了上面的代码实例,我得到了名字,但它与电子邮件 ID 所有者的名字不同。

那么,告诉我哪里出错了..

从上面的代码sn-p,我也试过了

if (email == sEmail) {
                            sName = name;
                        }
                        System.out.println("Email " + email + " Email Type : " + emailType);
                    }



                }
                if (emailCur != null) {
                    emailCur.close();
                }

而不是

                        System.out.println("Email " + email + " Email Type : " + emailType);
                    }

                    if (email == sEmail) {
                        sName = name;
                    }

                }
                if (emailCur != null) {
                    emailCur.close();
                }

但也没有帮助。

【问题讨论】:

    标签: android email android-contacts android-contentresolver contactscontract


    【解决方案1】:

    你应该替换

     Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email));
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
    

    Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(email));
        Cursor cursor = cr.query(uri, new String[]{ContactsContract.CommonDataKinds.Email.CONTACT_ID,
                ContactsContract.Data.DISPLAY_NAME}, null, null, null);
    

    然后测试它..

    【讨论】:

      【解决方案2】:

      在使用前务必检查 getCount。

      if(cursor!=null && cursor.getCount()>0 )
      {
       cursor.moveToFirst();
      
      
      }else{
         return null;
      }
      

      还要检查你是否声明了在 manifest 中读取联系人的权限:

      <uses-permission android:name="android.permission.READ_CONTACTS" />
      

      您还需要一些其他相关权限,请查看文档以了解内容。

      我建议以这种方式尝试并使用断点调试您的代码 问题出在哪里。

      public static String readContacts(Context context, String email) {
          ContentResolver cr = context.getContentResolver();
          Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(email));
          Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
          String contactName = null;
          if(cursor!=null && cursor.getCount()>0 )
          {
           cursor.moveToFirst();
           contactName =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
          }else{
             return null;
          }
          if (!cursor.isClosed()) {
              cursor.close();
          }
      
          Log.e("....contact name....", email + "\n" + contactName);
      
          return contactName;
      
      }
      

      【讨论】:

      • 它根本没有帮助。我在有问题的edit-2中添加了,但现在我什至没有得到日志来跟踪代码。
      • 现在你@rohitsharma 的这个编辑没有帮助,现在将尝试调试代码。
      • 即使调试也没有帮助我,因为在 contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2021-08-23
      相关资源
      最近更新 更多