12

ユーザーが連絡先ピッカーを使用して連絡先から電話番号を選択できるようにしようとしています。ただし、現在、オンラインで見られるすべての例は、連絡先を選択する方法を示していますが、連絡先に複数の電話番号がある場合は、2番目の画面がポップアップして、選択する番号を指定できるようにしたいと考えています (方法そのテキスト メッセージを使用すると、連絡先を選択するときにそれを行うことができます)。

私の質問は、すべての数字を収集してから、ユーザーに数字を選択するように求める必要がありますか、それともこの機能は既に Android に組み込まれていますか? フラグか何かを忘れただけだといいのですが。

4

4 に答える 4

12

または、連絡先ピッカーで各連絡先に関連付けられている電話番号を最初に表示し、その方法で 1 つを選択することもできます。この方法で連絡先ピッカーを起動します (私の他の回答とは異なる URI に注意してください):

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(intent, REQUEST_PICK_CONTACT);

次に、onActivityResult() で:

Uri result = data.getData();
Log.v(TAG, "Got a result: " + result.toString());

// get the phone number id from the Uri
String id = result.getLastPathSegment();

// query the phone numbers for the selected phone number id
Cursor c = getContentResolver().query(
    Phone.CONTENT_URI, null,
    Phone._ID + "=?",
    new String[]{id}, null);

int phoneIdx = c.getColumnIndex(Phone.NUMBER);

if(c.getCount() == 1) { // contact has a single phone number
    // get the only phone number
    if(c.moveToFirst()) {
        phone = c.getString(phoneIdx);
        Log.v(TAG, "Got phone number: " + phone);

        loadContactInfo(phone); // do something with the phone number

    } else {
        Log.w(TAG, "No results");
    }
}
于 2011-07-05T18:16:18.130 に答える
6

連絡先に関連付けられたすべての電話番号を表示する 2 番目のダイアログを作成することで、これを行うことができました。まず、これをコードのどこかで呼び出します。

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, REQUEST_PICK_CONTACT);

次に onActivityResult() でこれを使用して、選択した連絡先に複数の電話番号があるかどうかを判断し、複数ある場合はダイアログを表示します。

Uri result = data.getData();
Log.v(TAG, "Got a result: " + result.toString());

// get the contact id from the Uri
String id = result.getLastPathSegment();

// query for phone numbers for the selected contact id
c = getContentResolver().query(
    Phone.CONTENT_URI, null,
    Phone.CONTACT_ID + "=?",
    new String[]{id}, null);

int phoneIdx = c.getColumnIndex(Phone.NUMBER);
int phoneType = c.getColumnIndex(Phone.TYPE);

if(c.getCount() > 1) { // contact has multiple phone numbers
    final CharSequence[] numbers = new CharSequence[c.getCount()];
    int i=0;
    if(c.moveToFirst()) {
        while(!c.isAfterLast()) { // for each phone number, add it to the numbers array
            String type = (String) Phone.getTypeLabel(this.getResources(), c.getInt(phoneType), ""); // insert a type string in front of the number
            String number = type + ": " + c.getString(phoneIdx);
            numbers[i++] = number;
            c.moveToNext();
        }
        // build and show a simple dialog that allows the user to select a number
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.select_contact_phone_number_and_type);
        builder.setItems(numbers, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int item) {
                String number = (String) numbers[item];
                int index = number.indexOf(":");
                number = number.substring(index + 2);
                loadContactInfo(number); // do something with the selected number
            }
        });
        AlertDialog alert = builder.create();
        alert.setOwnerActivity(this);
        alert.show();

    } else Log.w(TAG, "No results");
} else if(c.getCount() == 1) {
    // contact has a single phone number, so there's no need to display a second dialog
}

これは古い質問ですが、お役に立てば幸いです。

于 2011-07-05T17:48:25.143 に答える
3

誰かがこれに出くわした場合に備えて。

他の回答に代わる別の方法は、ライブラリhttps://github.com/codinguser/android_contact_pickerです。

完全開示: 私はこのライブラリの作成者です

于 2011-12-05T15:52:22.407 に答える