使用选择意图从电话簿中检索保存的地址
Retrieveing saved address from phonebook by using a pick intent
我想使用意图从 phone 书中选择一个联系人,所选联系人还应包含相应的城市和州(如果由用户保存)。
以下是我过去几天的尝试:
private void accessContacts() {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
intent.setDataAndType(ContactsContract.Contacts.CONTENT_URI,
ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PICK_CONTACT:
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
String[] projection = {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
String name = null;
String phoneNumber = null;
String city = null;
String state = null;
Cursor c =
getActivity().getContentResolver().query(contactData, null, null, null, null);
if (c != null) {
if (c.moveToFirst()) {
int nameIdx = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int phoneNumberIdx = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
name = c.getString(nameIdx);
phoneNumber = c.getString(phoneNumberIdx);
String id = c.getString(c.getColumnIndex(ContactsContract.PhoneLookup._ID));
String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND "
+ ContactsContract.Data.MIMETYPE + " = ?";
String[] addrWhereParams = new String[]{id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
Cursor addrCur = getActivity().getContentResolver()
.query(ContactsContract.Data.CONTENT_URI,
null, addrWhere, addrWhereParams, null);
if (addrCur.moveToFirst()) {
city = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
state = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
}
addrCur.close();
}
c.close();
}
if (name == null) {
name = "No Name";
}
if (TextUtils.isEmpty(phoneNumber) || phoneNumber.length() < 10) {
handleAddConnectionError(getContext().getString(R.string.invalid_phone_number));
return;
}
Phonenumber.PhoneNumber number =
Utils.validateMobileNumber2(phoneNumber, Device.getCountryCode(getActivity()));
if (number == null) {
handleAddConnectionError(getContext().getString(R.string.invalid_phone_number));
return;
}
this.moveToCategoryPage(name, String.valueOf(number.getNationalNumber()),
Utils.getCountryCodeWithPlusSign(number), false, null,
city, state);
}
break;
}
}
而 removing/changing 这个:
intent.setDataAndType(ContactsContract.Contacts.CONTENT_URI,
ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
它抛出异常。
如何从选择意图中获取保存的地址?
我在这里看到一个大错误:
String id = c.getString(c.getColumnIndex(ContactsContract.PhoneLookup._ID));
查询 Phone.CONTENT_URI
时不应使用 PhoneLookup.XXX
列,此代码实际上 returns Phone._ID
列(因为两者具有相同的常量字符串名称),这不是一个 contactID,它是一个特定的 phone 的 ID(或 Data._ID
)。
您也无法从未在投影中指定的游标访问列。
所以将投影更改为:
String[] projection = {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
};
并将该行替换为:
Long contactId = c.getLong(2);
您可以做的另一件事是通过像这样查询 StructuredPostal.CONTENT_URI
来简化您的第二个查询:
String addrWhere = StructuredPostal.CONTACT_ID + " = " + contactId;
Cursor addrCur = getActivity().getContentResolver().query(StructuredPostal.CONTENT_URI, null, addrWhere, null, null);
请注意,与您第一次查询 Phone.NUMBER
信息不同,您的应用需要 READ_CONTACTS
权限才能对地址进行第二次查询,这是因为您要求 phone-picker intent 为您的应用程序提供临时。仅允许从联系人 API 访问所选的 phone 号码,除此之外任何其他需要许可的内容。
我想使用意图从 phone 书中选择一个联系人,所选联系人还应包含相应的城市和州(如果由用户保存)。
以下是我过去几天的尝试:
private void accessContacts() {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
intent.setDataAndType(ContactsContract.Contacts.CONTENT_URI,
ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PICK_CONTACT:
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
String[] projection = {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
String name = null;
String phoneNumber = null;
String city = null;
String state = null;
Cursor c =
getActivity().getContentResolver().query(contactData, null, null, null, null);
if (c != null) {
if (c.moveToFirst()) {
int nameIdx = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int phoneNumberIdx = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
name = c.getString(nameIdx);
phoneNumber = c.getString(phoneNumberIdx);
String id = c.getString(c.getColumnIndex(ContactsContract.PhoneLookup._ID));
String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND "
+ ContactsContract.Data.MIMETYPE + " = ?";
String[] addrWhereParams = new String[]{id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
Cursor addrCur = getActivity().getContentResolver()
.query(ContactsContract.Data.CONTENT_URI,
null, addrWhere, addrWhereParams, null);
if (addrCur.moveToFirst()) {
city = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
state = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
}
addrCur.close();
}
c.close();
}
if (name == null) {
name = "No Name";
}
if (TextUtils.isEmpty(phoneNumber) || phoneNumber.length() < 10) {
handleAddConnectionError(getContext().getString(R.string.invalid_phone_number));
return;
}
Phonenumber.PhoneNumber number =
Utils.validateMobileNumber2(phoneNumber, Device.getCountryCode(getActivity()));
if (number == null) {
handleAddConnectionError(getContext().getString(R.string.invalid_phone_number));
return;
}
this.moveToCategoryPage(name, String.valueOf(number.getNationalNumber()),
Utils.getCountryCodeWithPlusSign(number), false, null,
city, state);
}
break;
}
}
而 removing/changing 这个:
intent.setDataAndType(ContactsContract.Contacts.CONTENT_URI, ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
它抛出异常。
如何从选择意图中获取保存的地址?
我在这里看到一个大错误:
String id = c.getString(c.getColumnIndex(ContactsContract.PhoneLookup._ID));
查询 Phone.CONTENT_URI
时不应使用 PhoneLookup.XXX
列,此代码实际上 returns Phone._ID
列(因为两者具有相同的常量字符串名称),这不是一个 contactID,它是一个特定的 phone 的 ID(或 Data._ID
)。
您也无法从未在投影中指定的游标访问列。
所以将投影更改为:
String[] projection = {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
};
并将该行替换为:
Long contactId = c.getLong(2);
您可以做的另一件事是通过像这样查询 StructuredPostal.CONTENT_URI
来简化您的第二个查询:
String addrWhere = StructuredPostal.CONTACT_ID + " = " + contactId;
Cursor addrCur = getActivity().getContentResolver().query(StructuredPostal.CONTENT_URI, null, addrWhere, null, null);
请注意,与您第一次查询 Phone.NUMBER
信息不同,您的应用需要 READ_CONTACTS
权限才能对地址进行第二次查询,这是因为您要求 phone-picker intent 为您的应用程序提供临时。仅允许从联系人 API 访问所选的 phone 号码,除此之外任何其他需要许可的内容。