Android-显示电话簿联系人并选择一个

Android-显示电话簿联系人并选择一个,android,android-layout,android-intent,android-emulator,Android,Android Layout,Android Intent,Android Emulator,我想在电话簿中单击按钮显示联系人列表,然后从中选择一个联系人,然后检索其联系人号码?我不想做我的自定义列表,有没有办法使用androids内置的功能 Intent i=new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(i, PICK_REQUEST); 交付给onActivityResult方法的意图将包含所选联系人的Uri——您将通过调用该意图的getD

我想在电话簿中单击按钮显示联系人列表,然后从中选择一个联系人,然后检索其联系人号码?我不想做我的自定义列表,有没有办法使用androids内置的功能

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

startActivityForResult(i, PICK_REQUEST);
交付给onActivityResult方法的意图将包含所选联系人的Uri——您将通过调用该意图的getData来获得此信息

这说明了这一点,逻辑是在一个保留的片段中实现的,因此我们在配置更改(例如,用户旋转屏幕)期间保留选定的联系人

您也可以使用ACTION\u GET\u CONTENT来实现这一点,我认为这是更现代的模式,尽管ACTION\u PICK确实有效,并且是我在撰写本文时仅有的示例代码。如果你在将来读到这篇文章,嗨,未来!,链接到示例的内容可能已更新为使用操作获取内容。

试试这个->

   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>

我知道这个问题很老了,但我在我的应用程序中也做了同样的事情,我想在这里发布我的代码,如果这对将来的任何人都有帮助的话

这是如何开始显示列表的新意图

    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是类中定义的常量。

在我测试的nexus 5x emulator中:

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

不适用于所有联系人。我不知道为什么。但这是:

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

有效。

对于Kotlin,请求获取联系人的代码

private val REQUEST_CONTACT = 201
打算启动电话簿

 private fun fetchPhoneNo() {
        val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
        startActivityForResult(intent, REQUEST_CONTACT)
    }
在onActivityResult中获取电话号码

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()
            }
    }
添加拾取联系人字段:

在onCreate中:

在onActivityResult中:


下面是我在API级别29中尝试的工作代码+

步骤1:在AndroidManifest.xml中添加权限

<uses-permission android:name="android.permission.READ_CONTACTS" />
步骤3:处理联系人选择

 @Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_PICK_CONTACT) {
        if (resultCode == RESULT_OK) {
            Cursor cursor1, cursor2;
            Uri uri = data.getData();

            cursor1 = getContentResolver().query(uri, null, null, null, null);
            if(cursor1.moveToFirst()) {
                String contactId = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts._ID));
                String contactName = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String hasNumber = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                if("1".equals(hasNumber)) {
                    cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
                    while(cursor2.moveToNext()) {
                        String contactNumber = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        //Use contactName and contactNumber for your purposes
                    }
                    cursor2.close();
                }
            }
            cursor1.close();
            //edtName.setText(contactName);
            //edtNumber.setText(number);
        }
    }
}

解决方案礼貌:

@Dani如果它对你有用,你可以选择它作为回答,以帮助将来面临同样问题的人。这是一个必须通过的论点。当您收到结果意图时,回调将提供相同的参数,以便您的应用程序能够正确识别结果并确定如何处理它。您必须更改的原因是您可能使用了PICK_CONTACT而不是RQS_uuPick_CONTACT。可以将此视为一个令牌,您可以通过它传递和返回来标识您的请求。managedQuery已被删除,现在使用getContentResolver是最佳实践。queryi尝试了此方法,并且工作良好。但是你能帮我找到多个联系人吗?
       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();
        }


    });
@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;
        }
    }
}
<uses-permission android:name="android.permission.READ_CONTACTS" />
private static final int REQ_PICK_CONTACT = 3;
private static final int CONTACT_PERMISSION_CODE = 1;
//Onclick handler
public void openContacts(View view) {
    if(checkContactPermission()) {
        openContactsDialog();
    } else {
        requestContactPermission();
    }
}

//If permission is granted, then open contact box
private void openContactsDialog() {
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent, REQ_PICK_CONTACT);
}

//Check if the user has the permission granted
private boolean checkContactPermission() {
    boolean result = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
    return result;
}

//Invoke request permission dialog
private void requestContactPermission() {
    String[] permission = {Manifest.permission.READ_CONTACTS};
    ActivityCompat.requestPermissions(this, permission, CONTACT_PERMISSION_CODE);
}
//After the permission is granted, open the contact dialog
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if(requestCode == CONTACT_PERMISSION_CODE){
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            openContactsDialog();
        }
    }
}
 @Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_PICK_CONTACT) {
        if (resultCode == RESULT_OK) {
            Cursor cursor1, cursor2;
            Uri uri = data.getData();

            cursor1 = getContentResolver().query(uri, null, null, null, null);
            if(cursor1.moveToFirst()) {
                String contactId = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts._ID));
                String contactName = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String hasNumber = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                if("1".equals(hasNumber)) {
                    cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
                    while(cursor2.moveToNext()) {
                        String contactNumber = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        //Use contactName and contactNumber for your purposes
                    }
                    cursor2.close();
                }
            }
            cursor1.close();
            //edtName.setText(contactName);
            //edtNumber.setText(number);
        }
    }
}