Средство выбора контактов Android: имя + номер + адрес электронной почты

У меня проблемы с выбором контактов, он работает с Phone.DISPLAY_NAME и Phone.NUMBER, но не работает с Email.ADDRESS

public class CustomerForm extends Activity {
private final static int CONTACT_PICKER = 1;
private EditText txtMailContacto;
private EditText txtNombreContacto;
private EditText txtTelefono;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customer_form);
    txtMailContacto = (EditText) findViewById(R.id.txtMailContacto);
    txtTelefono = (EditText) findViewById(R.id.txtTelefono);
    txtNombreContacto = (EditText) findViewById(R.id.txtNombreContacto);
}
public void pickContact(View v)
{
    Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(contactPickerIntent, CONTACT_PICKER);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // check whether the result is ok
    if (resultCode == RESULT_OK) {
        // Check for the request code, we might be usign multiple startActivityForReslut
        switch (requestCode) {
        case CONTACT_PICKER:
            contactPicked(data);
            break;
        }
    } else {
        Log.e("MainActivity", "Failed to pick contact");
    }
}
private void contactPicked(Intent data) {
    Cursor cursor = null;
    try {
        String mail = null ;
        String phoneNo = null ;
        String name = null;
        // getData() method will have the Content Uri of the selected contact
        Uri uri = data.getData();
        //Query the content uri
        cursor = getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        // column index of the phone number
        int  phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
        // column index of the email
        int  mailIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
        // column index of the contact name
        int  nameIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
        mail = cursor.getString(mailIndex);
        phoneNo = cursor.getString(phoneIndex);
        name = cursor.getString(nameIndex);
        // Set the value to the textviews
        txtMailContacto.setText(mail);
        txtTelefono.setText(phoneNo);
        txtNombreContacto.setText(name);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Итак, я пытаюсь получить эти поля, но не могу понять, в чем проблема. Спасибо за помощь...


person absolutkarlos    schedule 05.10.2015    source источник


Ответы (2)


Понятно!!!

public class CustomerForm extends Activity {
private final static int CONTACT_PICKER = 1;
private EditText txtMailContacto;
private EditText txtNombreContacto;
private EditText txtTelefono;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customer_form);
    txtMailContacto = (EditText) findViewById(R.id.txtMailContacto);
    txtTelefono = (EditText) findViewById(R.id.txtTelefono);
    txtNombreContacto = (EditText) findViewById(R.id.txtNombreContacto);
}
public void pickContact(View v)
{
    Intent contactPickerIntent = 
            new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(contactPickerIntent, CONTACT_PICKER);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // check whether the result is ok
    if (resultCode == RESULT_OK) {
        // Check for the request code, we might be using multiple startActivityForReslut
        switch (requestCode) {
        case CONTACT_PICKER:
            contactPicked(data);
            break;
        }
    } else {
        Log.e("MainActivity", "Failed to pick contact");
    }
}
private void contactPicked(Intent data) {
    ContentResolver cr = getContentResolver();
    try {
        // getData() method will have the Content Uri of the selected contact
        Uri uri = data.getData();
        //Query the content uri
        cur = cr.query(uri, null, null, null, null);
        cur.moveToFirst();
                                                // column index of the contact ID
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                                                // column index of the contact name 
        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        txtNombreContacto.setText(name);        //print data            
                                                // column index of the phone number
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                    new String[]{id}, null);
                    while (pCur.moveToNext()) {
                        String phone = pCur.getString(
                                pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        txtTelefono.setText(phone);         //print data
                    } 
                    pCur.close();
                                                // column index of the email   
        Cursor emailCur = cr.query(        
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
                null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",  
                new String[]{id}, null); 
            while (emailCur.moveToNext()) { 
                // This would allow you get several email addresses
                    // if the email addresses were stored in an array  
                String email = emailCur.getString(
                              emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));                                         
                txtMailContacto.setText(email);         //print data
        } 
        emailCur.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
person absolutkarlos    schedule 06.10.2015
comment
ваш первый запрос кажется бесполезным? Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); - person behelit; 20.10.2016
comment
@behelit Согласен! Я тестировал его без этого первоначального запроса, и он отлично работает. Отредактировал ответ и удалил его. - person Joshua Pinter; 09.01.2017
comment
Теперь, когда вы удалили Cursor cur, код неполный - person Jonathan Dunn; 19.05.2017

Лучший ответ когда-либо, он помогает вам просто выбрать контактное имя или контактный номер, работать отлично, пожалуйста, предоставьте контакту разрешение на чтение перед использованием.

@Override
public void onActivityResult(int RequestCode, int ResultCode, Intent ResultIntent) {

    super.onActivityResult(RequestCode, ResultCode, ResultIntent);

    switch (RequestCode) {

        case (7):
            if (ResultCode == Activity.RESULT_OK) {

                Uri uri;
                Cursor cursor1, cursor2;
                String TempNameHolder, TempNumberHolder, TempContactID, IDresult = "" ;
                int IDresultHolder ;

                uri = ResultIntent.getData();

                cursor1 = getContentResolver().query(uri, null, null, null, null);

                if (cursor1.moveToFirst()) {

                    TempNameHolder = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                    TempContactID = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts._ID));

                    IDresult = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                    IDresultHolder = Integer.valueOf(IDresult) ;

                    if (IDresultHolder == 1) {

                        cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + TempContactID, null, null);

                        while (cursor2.moveToNext()) {

                            TempNumberHolder = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                            name.setText(TempNameHolder);

                            number.setText(TempNumberHolder);

                        }
                    }

                    }
                }
                break;
            }
    }
}
person Arun Prajapati    schedule 26.06.2018