web-dev-qa-db-ja.com

androidの電話帳から複数の連絡先を選択します

Androidの電話帳から連絡先番号/メールを選択する必要があります。

1つの連絡先を選択して、結果をonActivityResultthis link から取得するのを見てきました。

しかし、電話帳から複数の連絡先を選択する必要があります。これを達成する方法は?

カスタムリストを作成したくないのですが、Androidの組み込み機能を使用する方法はありますか?

18
Kartheek s

電話帳から複数の連絡先を選択するためのコードを共有しています。少し変化があり、目標を達成できます。ありがとう

 getAllContacts(this.getContentResolver());
    ListView lv = (ListView) findViewById(R.id.lv);
    ma = new MyAdapter();
    lv.setAdapter(ma);
    lv.setOnItemClickListener(this);
    lv.setItemsCanFocus(false);
    lv.setTextFilterEnabled(true);
    // adding
    select = (Button) findViewById(R.id.button1);
    select.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            StringBuilder checkedcontacts = new StringBuilder();

            for (int i = 0; i < name1.size(); i++)

            {
                if (ma.mCheckStates.get(i) == true) {
                    checkedcontacts.append(name1.get(i).toString());
                    checkedcontacts.append("\n");

                } else {

                }

            }

            Toast.makeText(Display.this, checkedcontacts, 1000).show();
        }
    });

}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    // TODO Auto-generated method stub
    ma.toggle(arg2);
}

public void getAllContacts(ContentResolver cr) {

    Cursor phones = cr.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
            null, null);
    while (phones.moveToNext()) {
        String name = phones
                .getString(phones
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = phones
                .getString(phones
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        name1.add(name);
        phno1.add(phoneNumber);
    }

    phones.close();
}

class MyAdapter extends BaseAdapter implements
        CompoundButton.OnCheckedChangeListener {
    private SparseBooleanArray mCheckStates;
    LayoutInflater mInflater;
    TextView tv1, tv;
    CheckBox cb;

    MyAdapter() {
        mCheckStates = new SparseBooleanArray(name1.size());
        mInflater = (LayoutInflater) Display.this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return name1.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub

        return 0;
    }

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        // TODO Auto-generated method stub
        View vi = convertView;
        if (convertView == null)
            vi = mInflater.inflate(R.layout.row, null);
        tv = (TextView) vi.findViewById(R.id.textView1);
        tv1 = (TextView) vi.findViewById(R.id.textView2);
        cb = (CheckBox) vi.findViewById(R.id.checkBox1);
        tv.setText("Name :" + name1.get(position));
        tv1.setText("Phone No :" + phno1.get(position));
        cb.setTag(position);
        cb.setChecked(mCheckStates.get(position, false));
        cb.setOnCheckedChangeListener(this);

        return vi;
    }

    public boolean isChecked(int position) {
        return mCheckStates.get(position, false);
    }

    public void setChecked(int position, boolean isChecked) {
        mCheckStates.put(position, isChecked);
    }

    public void toggle(int position) {
        setChecked(position, !isChecked(position));
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        // TODO Auto-generated method stub

        mCheckStates.put((Integer) buttonView.getTag(), isChecked);
    }
3
anupam sharma

そのような「公式の」方法はないようです。あなたの質問は基本的にこれと同じです Android SDK with customで複数の連絡先を選択する方法)実装

AOSP連絡先アプリケーションをチェックした場合、ドキュメントにもそのような可能性はありません。 AOSP連絡先のソースから私が観察した唯一のものは、(com.Android.contacts.activities.PeopleActivityで)次の言及です:

// TODO fix or remove multipicker code
//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {

MMSアプリのソースコードから 以下を確認できます(ComposeMessageActivity内):

private void launchMultiplePhonePicker() {
    Intent intent = new Intent(Intents.ACTION_GET_MULTIPLE_PHONES);
    intent.addCategory("Android.intent.category.DEFAULT");
    intent.setType(Phone.CONTENT_TYPE);
    // We have to wait for the constructing complete.
    ContactList contacts = mRecipientsEditor.constructContactsFromInput(true);
    int urisCount = 0;
    Uri[] uris = new Uri[contacts.size()];
    urisCount = 0;
    for (Contact contact : contacts) {
        if (Contact.CONTACT_METHOD_TYPE_PHONE == contact.getContactMethodType()) {
                uris[urisCount++] = contact.getPhoneUri();
        }
    }
    if (urisCount > 0) {
        intent.putExtra(Intents.EXTRA_PHONE_URIS, uris);
    }
    startActivityForResult(intent, REQUEST_CODE_PICK);
}

フィールドIntents.ACTION_GET_MULTIPLE_PHONESContactsContract.Java で利用できますが、AOSP全体でその使用法を見つけることができませんでした。だから、私はそれがいくつかのデッドコードであるか、そのアクションがいくつかのクローズドコードで処理されると思います。同じ方法でテストアプリケーションから連絡先の選択を起動しましたが、アクションを処理するアプリケーションがないという例外のみが発生しました。

もちろん、ベンダーの連絡先アプリケーションがそのような機能を提供します(メッセージの受信者を選択するなど)が、それらに依存しない方が良いです。

2
sandrstar