質問

コンタクトピッカーに電話し、人の名前、電話、電子メールを文字列に入れて、意図を使用して別のアクティビティに送信しようとしています。これまでのところ、これは次のとおりです。

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でのみ確認されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top