web-dev-qa-db-ja.com

Android-電話帳の連絡先を表示して選択する

ボタンをクリックするだけで電話帳に連絡先のリストを表示し、そこから連絡先の1つを選択して、その連絡先番号を取得したいですか?カスタムリストを作成したくないのですが、Androidに組み込まれている機能を使用する方法はありますか?

13
mdanishs

これを試してください->

   setContentView(R.layout.main);

   contactNumber = (TextView)findViewById(R.id.contactnumber);

   Button buttonPickContact = (Button)findViewById(R.id.pickcontact);
   buttonPickContact.setOnClickListener(new Button.OnClickListener(){

   @Override
    public void onClick(View arg0) {
   // TODO Auto-generated method stub


   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
   intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
   startActivityForResult(intent, 1);             


    }});
   }

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

   if(requestCode == RQS_PICK_CONTACT){
   if(resultCode == RESULT_OK){
    Uri contactData = data.getData();
    Cursor cursor =  managedQuery(contactData, null, null, null, null);
    cursor.moveToFirst();

      String number =       cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));

      //contactName.setText(name);
      contactNumber.setText(number);
      //contactEmail.setText(email);
     }
     }
     }
     }

XMLの編集が追加されました。

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:layout_width="match_parent"
       Android:layout_height="match_parent"
       Android:orientation="vertical" >

      <Button
        Android:id="@+id/pickcontact"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Pick Contact" />

      <TextView
       Android:id="@+id/contactnumber"
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content" />

 </LinearLayout>
18
Mohit

この質問は古いと思いますが、アプリケーションで同じことをしていて、将来誰かに役立つのであれば、ここにコードを投稿しようと考えました。

これは、リストを表示するための新しいインテントを開始する方法です

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

そしてこれが結果の処理方法です

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_CONTACT) {
            if (resultCode == RESULT_OK) {
                Uri contactData = data.getData();
                String number = "";
                Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
                cursor.moveToFirst();
                String hasPhone = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            String contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
            if (hasPhone.equals("1")) {
                Cursor phones = getContentResolver().query
                        (ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                        + " = " + contactId, null, null);
                while (phones.moveToNext()) {
                    number = phones.getString(phones.getColumnIndex
                   (ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll("[-() ]", "");
                }
                phones.close();
    //Do something with number
            } else {
                Toast.makeText(getApplicationContext(), "This contact has no phone number", Toast.LENGTH_LONG).show();
            }
                cursor.close();
                }
            }
        }
    }

PICK_CONTACTは、クラスで定義されている定数です。

_Intent i=new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

startActivityForResult(i, PICK_REQUEST);
_

onActivityResult()メソッドに配信されるIntentには、選択した連絡先のUriが含まれます。これは、そのIntentgetData()を呼び出すことで取得できます。

これはサンプルプロジェクトです これを示しています。ロジックは保持されたフラグメントに実装されているため、構成の変更(ユーザーが画面を回転するなど)全体で選択した連絡先にハングアップします。

これには_ACTION_GET_CONTENT_を使用することもできます。これは、より現代的なパターンだと思いますが、_ACTION_PICK_は確かに機能し、この記事の執筆時点でサンプルコードを持っているのはこれだけです。将来(こんにちは、future!)これを読んでいる場合は、リンク先のサンプルが_ACTION_GET_CONTENT_を使用するように更新されている可能性があります。

3
CommonsWare

Kotlinの場合、連絡先を取得するためのRequestCode

private val REQUEST_CONTACT = 201

電話帳を起動する意図

 private fun fetchPhoneNo() {
        val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
        startActivityForResult(intent, REQUEST_CONTACT)
    }

OnActivityResultでPhoneNoを取得します

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
 if (requestCode == REQUEST_CONTACT && data?.data != null) {
               val contactUri = data.data;
        val crContacts = contentResolver.query(contactUri, null, null, null, null);
        crContacts.moveToFirst()
        val id = crContacts.getString(crContacts.getColumnIndex(ContactsContract.Contacts._ID));
        if (Integer.parseInt(crContacts.getString(crContacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            val crPhones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                            + " = ?", arrayOf(id), null)
            crPhones.moveToFirst()
        var phoneNo = crPhones.getString(
crPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))                     
                crPhones.close()
            }
            crContacts.close()
            }
    }
1
Raja Jawahar

私がこれをテストしたネクサス5xエミュレーターで:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
   intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
   startActivityForResult(intent, 1);   

または:

Uri uri = Uri.parse("content://contacts");
        Intent intent = new Intent(Intent.ACTION_PICK, uri);
        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
        startActivityForResult(intent, 1);

すべての連絡先で機能するわけではありません。理由はわかりません。でもこれは:

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

動作します。

0
David

追加_PICK_CONTACT_フィールド:

_private final int PICK_CONTACT = 55;
_

onCreate()内:

_       viewPhonebook.setOnClickListener(v -> {
        try {
            Uri uri = Uri.parse("content://contacts");
            Intent intent = new Intent(Intent.ACTION_PICK, uri);
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
            startActivityForResult(intent, PICK_CONTACT);
        } catch (Exception e) {
            e.printStackTrace();
        }


    });
_

onActivityResult()内:

_@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case PICK_CONTACT:
                     Uri contactData = data.getData();
                    Cursor cursor = managedQuery(contactData, null, null, null, null);
                    cursor.moveToFirst();
                    String number = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    edtName.setText(contactName);
                    edtNumber.setText(number);
                    break;
        }
    }
}
_
0
Shahab Saalami