无法从 android 中选择的联系人获取电子邮件地址
Not able to get email address from picked contact in android
我正在尝试使用 android 中的意图选择联系人。我需要的信息是姓名、phone 号码和联系人的电子邮件地址。按照我到目前为止的尝试。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
// Check for the request code, we might be usign multiple startActivityForReslut
switch (requestCode) {
case RESULT_PICK_CONTACT:
contactPicked(data);
break;
}
}
}
private void contactPicked(Intent data) {
Cursor cursor = null;
try {
// getData() method will have the Content Uri of the selected contact
Uri uri = data.getData();
//Query the content uri
cursor = getActivity().getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
String phoneNo = cursor.getString(phoneIndex);
String name = cursor.getString(nameIndex);
String contactBookId = uri.getLastPathSegment();
String email = null;
try {
Cursor emailCur
= getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{contactBookId}, null);
emailCur.moveToFirst();
while (emailCur.moveToNext()) {
String phone = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
int type = emailCur.getInt(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
String s = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(getActivity().getResources(), type, "");
Log.d("TAG", s + " email: " + phone);
}
emailCur.close();
} catch (Exception e) {
Log.e(TAG, "Exception while trying to fetch email addresses of " + name + ":" + e.getMessage());
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这是我发射意图的方式
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);
我的问题是 emailCur 从不读取任何电子邮件地址。代码永远不会进入循环。
编辑
即使我放弃 getLastPathSegment()
并按如下方式检索 ID,我也会得到相同的行为
int idIndex = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID);
String contactBookId = cursor.getString(idIndex);
问题出在这里:
emailCur.moveToFirst();
while (emailCur.moveToNext()) {
...
}
您在阅读前将光标移动了两次,如果联系人有 1 封电子邮件,则永远不会进入 while 循环。
删除emailCur.moveToFirst();
我正在尝试使用 android 中的意图选择联系人。我需要的信息是姓名、phone 号码和联系人的电子邮件地址。按照我到目前为止的尝试。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
// Check for the request code, we might be usign multiple startActivityForReslut
switch (requestCode) {
case RESULT_PICK_CONTACT:
contactPicked(data);
break;
}
}
}
private void contactPicked(Intent data) {
Cursor cursor = null;
try {
// getData() method will have the Content Uri of the selected contact
Uri uri = data.getData();
//Query the content uri
cursor = getActivity().getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
String phoneNo = cursor.getString(phoneIndex);
String name = cursor.getString(nameIndex);
String contactBookId = uri.getLastPathSegment();
String email = null;
try {
Cursor emailCur
= getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{contactBookId}, null);
emailCur.moveToFirst();
while (emailCur.moveToNext()) {
String phone = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
int type = emailCur.getInt(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
String s = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(getActivity().getResources(), type, "");
Log.d("TAG", s + " email: " + phone);
}
emailCur.close();
} catch (Exception e) {
Log.e(TAG, "Exception while trying to fetch email addresses of " + name + ":" + e.getMessage());
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这是我发射意图的方式
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);
我的问题是 emailCur 从不读取任何电子邮件地址。代码永远不会进入循环。
编辑
即使我放弃 getLastPathSegment()
并按如下方式检索 ID,我也会得到相同的行为
int idIndex = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID);
String contactBookId = cursor.getString(idIndex);
问题出在这里:
emailCur.moveToFirst();
while (emailCur.moveToNext()) {
...
}
您在阅读前将光标移动了两次,如果联系人有 1 封电子邮件,则永远不会进入 while 循环。
删除emailCur.moveToFirst();