ユーザーが連絡先ピッカーから連絡先を選択した後、連絡先の名前と電話番号を取得しようとしています。アプリケーションを SDK v3 以降で動作させようとしているので、必要な API のみを呼び出す抽象クラスを作成しました。すでに抽象クラスが機能しており (適切な API が選択されています)、SDK v3,4 の API も機能しています。ContactsContract を使用する新しい API を動作させるのに問題があります。
連絡先の名前を取得できますが、取得する番号は常に連絡先 ID の番号です。例: 「John Doe」と「Jane Doe」という 2 つの連絡先があり、それぞれの番号が「555-555-555」と「777-777-7777」が連絡先に追加されています。John Doe は ID=1、Jane Doe は ID=2 です。Jane Doe の番号を取得しようとすると、John の 555-555-5555 になります。ジョンのものを手に入れようとしても、何も得られません。if (cursor.moveToNext()) のチェックが失敗します。
これを修正するのを手伝ってもらえますか? それは私を夢中にさせています。多くの例を見てきましたが、常に同じエラーが発生します。
インテント データは、onActivityResult からのデータ インテントです。
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;
}
}