20

こんにちは、デフォルトの連絡先帳のインテントから連絡先を選択したいと思います。私はそれを行うためにいくつかの方法を試しました。以下のコードを見つけてください。これらすべてのコードの問題は、ユーザーが連絡先を選択しなければならないオプションがほとんどない中間ドキュメント画面を 1 つ開き、連絡先帳を開くことです。

private void openContactIntent() {
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT, ContactsContract.Contacts.CONTENT_URI);
     intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
     startActivityForResult(intent, REQ_CONTACT_DIRECTORY);
}

私も試しました

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

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

中間画面として見えるのはここに画像の説明を入力

4

8 に答える 8

13

連絡先を選択するには、次のコードを試してください。

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
            startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);

次のように、onActivityResult で必要な情報を取得できます。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case RESULT_PICK_CONTACT:
                  Cursor cursor = null;
    try {
        String phoneNo = null;
        String name = null;

        Uri uri = data.getData();
        cursor = getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        int  phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
        int  nameIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
        phoneNo = cursor.getString(phoneIndex);
        name = cursor.getString(nameIndex);

       Log.e("Name and Contact number is",name+","+phoneNo);

    } catch (Exception e) {
        e.printStackTrace();
    }
                break;
        }
    } else {
        Log.e("Failed", "Not able to pick contact");
    }
}
于 2016-12-26T10:25:41.503 に答える
1

これは私のために働く:

Intent it= new Intent(Intent.ACTION_PICK, 
     ContactsContract.Contacts.CONTENT_URI); 
startActivityForResult(it, requestCode);
于 2016-12-26T09:24:24.540 に答える
0

これは、カーソルから連絡先情報を取得するのに役立つようにここに追加する (Kotlin での) 実装があると便利です。また、アクセス許可を付与し、実行時のアクセス許可を要求する必要があります

<uses-permission android:name="android.permission.READ_CONTACTS" />

    @SuppressLint("Recycle")
    private fun getContactDataFrom(
        contentResolver: ContentResolver,
        contactUri: Uri
    ): ContactModel? {
        val projection = arrayOf(
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.HAS_PHONE_NUMBER
        )

        try {
            val cursor = contentResolver.query(contactUri, projection, null, null, null) ?: return null
            if (!cursor.moveToFirst()) {
                return null
            }

            val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
            val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
            val hasNumber = (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
            cursor.close()

            val email = getEmail(contentResolver, id)

            val phoneNumber = if (hasNumber > 0) {
                getPhoneNumber(contentResolver, id)
            } else {
                ""
            }
            return ContactModel(name, phoneNumber, email)
        } catch (e: Exception) {
            Log.e("Contacts", "Could not get contact info.", e)
            return null
        }
    }

    @SuppressLint("Recycle")
    private fun getPhoneNumber(contentResolver: ContentResolver, id: String?): String {
        var phoneNumber = ""

        val cursor = contentResolver.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.Contacts._ID + " = ?",
            arrayOf(id),
            null
        ) ?: return phoneNumber

        if (cursor.moveToFirst()) {
            phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA))
        }

        cursor.close()
        return phoneNumber
    }

    @SuppressLint("Recycle")
    private fun getEmail(contentResolver: ContentResolver, id: String?): String {
        var email = ""

        val cursor = contentResolver.query(
            ContactsContract.CommonDataKinds.Email.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
            arrayOf(id),
            null
        ) ?: return email

        if (cursor.moveToFirst()) {
            email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))
        }

        cursor.close()
        return email
    }

引き金:

    val intent = Intent(this, PickLabelActivity::class.java)               
    startActivityForResult(intent, PickLabelActivity.REQ_CODE_PICK_LABEL)

onActivityResult での使用法は次のようになります。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

         if (resultCode == RESULT_OK && requestCode == ConstantsHandler.INTENT_CODE_PICK_CONTACT) {
            val contactUri = data?.data ?: return
            val contactModel = getContactDataFrom(contentResolver, contactUri)

            inputName.setText(contactModel?.name)
            inputPhone.setText(contactModel?.phone)
            inputEmail.setText(contactModel?.email)
        }
    }

その ContactModel は単純なデータ クラスです。

data class ContactModel(
    var name: String? = null,
    var phone: String? = null,
    var email: String? = null
) : Serializable
于 2020-12-13T12:13:54.620 に答える