在用户从联系人选择器中选择联系人后,我试图获取联系人姓名和电话号码。我试图让我的应用程序适用于 SDK v3 及更高版本,因此我创建了一个抽象类,它只调用我需要的 API。我已经让抽象类工作了(它选择了正确的 API),并且我也有用于 SDK v3,4 的 API 工作。我在获取使用 ContactsContract 的更新 API 时遇到问题。
我可以得到一个联系人姓名,但它检索到的号码始终是它之前的联系人 ID 的号码!示例:我有 2 个联系人“John Doe”和“Jane Doe”,分别在联系人中添加了“555-555-555”和“777-777-7777”。John Doe 的 ID=1,Jane Doe 的 ID=2。如果我尝试获取 Jane Doe 的电话号码,我会得到 John 的电话号码,555-555-5555。如果我试图得到约翰的,我什么也得不到。检查 if (cursor.moveToNext()) 失败。
你能帮我解决这个问题吗?这让我快疯了。我看过很多例子,总是得到同样的错误。
Intent 数据是来自 onActivityResult 的数据 Intent
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
class NewContactsAdapterBridge extends ContactsAdapterBridge {
ArrayList<String> info = new ArrayList<String>();
ArrayList<String> getInfo (Activity a, Intent data) {
Uri contactData = data.getData();
Cursor cursor = a.managedQuery(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
String id = cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow
(ContactsContract.Contacts.DISPLAY_NAME));
String hasPhoneNumber = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.Contacts.HAS_PHONE_NUMBER));
info.add(name);
if (Integer.parseInt(hasPhoneNumber) > 0) {
Uri myPhoneUri = Uri.withAppendedPath(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
id);
Cursor pCur = a.managedQuery(
myPhoneUri,
null,
null,
null,
null);
if (pCur.moveToNext()) {
String number = pCur.getString( pCur.getColumnIndex
(ContactsContract.CommonDataKinds.Phone.NUMBER));
info.add(number);
}
}
}
return info;
}
}