Android連絡先ピッカーから連絡先情報を入手してください
-
27-09-2019 - |
質問
コンタクトピッカーに電話し、人の名前、電話、電子メールを文字列に入れて、意図を使用して別のアクティビティに送信しようとしています。これまでのところ、これは次のとおりです。
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, 1);
// ...
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
intent.putExtra("name", name);
startActivityForResult(intent, 0);
}
}
}
しかし、私が追加する場合:
String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
強制的に閉じます
たぶん、彼らの番号を取得する別の方法がありますか?
解決
電話番号
電話番号は自分のテーブルに保存されており、個別に照会する必要があります。電話番号テーブルを照会するには、SDK変数contactscontract.commondatakinds.phone.content_uriに保存されているURIを使用します。 WHERE条件付きを使用して、指定された連絡先の電話番号を取得します。
if (Integer.parseInt(cur.getString(
cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
// Do something with phones
}
pCur.close();
}
Android連絡先SQLiteデータベースに対して2回目のクエリを実行します。電話番号は、contactscontract.commondatakinds.phone.content_uriに保存されているURIに対して照会されます。連絡先IDは、contactScontract.commondatakinds.phone.phone.contact_idおよびWhere句を使用して、返されるデータを制限するために電話テーブルに保存されます。
メールアドレス
メールアドレスのクエリは電話番号に似ています。データベースからメールアドレスを取得するには、クエリを実行する必要があります。 contactscontract.commondatakinds.email.content_uriに保存されているURIをクエリして、電子メールアドレステーブルを照会します。
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id}, null);
while (emailCur.moveToNext()) {
// This would allow you get several email addresses
// if the email addresses were stored in an array
String email = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
String emailType = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
}
emailCur.close();
電話のクエリと同様に、電子メールテーブルのフィールド名もContactScontract.Commondatakindsの下に保存されます。メールクエリは、contactscontract.commondatakinds.email.content_uriのURIで実行されます。Where句はContactScontract.commondatakinds.email.email.contact_idフィールドと一致する必要があります。複数の電子メールアドレスをカーソルで返したレコードを介してループを保存できるためです。
その他のチュートリアル ここ
この方法には、Android APIバージョン5以降が必要です。
他のヒント
受け入れられた回答に基づいて、目的のメールアドレスに直接ジャンプしたい場合、連絡先の許可を必要としない場合は、次のようなものを使用します。
private static final int REQUEST_CODE_EMAIL = 1;
void startSelectingEmail() {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_EMAIL);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) {
Uri emailUri = data.getData();
Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null);
if (emailCursor != null) {
if (emailCursor.moveToFirst()) {
String email = emailCursor.getString(
emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA));
String emailType = emailCursor.getString(
emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE));
Log.d(TAG, "Email: " + emailType + " " + email);
}
emailCursor.close();
}
}
}
これには、上記のダブルクエリメソッドのように、メールアドレスを読むための連絡先の許可は必要ありません。また、ユーザーが複数の電子メールを使用して連絡先の適切な電子メールアドレスを選択するためにUIを記述する必要がないようにするため、ユーザーは連絡先アプリで特定のメールを選択して、結果が1つしか表示されません。
カーソルには、ディスプレイ名のような電子メールアドレスだけに加えて、かなりの数の列が戻ってきますが、それはNexus 5を実行しているAndroid Mでのみ確認されています。