Получение номера из списка контактов - PullRequest
5 голосов
/ 27 мая 2011

Я пытаюсь получить имя и номер контакта после того, как пользователь выбрал контакт из средства выбора контактов.Я пытаюсь заставить мое приложение работать для SDK v3 и выше, поэтому я создал абстрактный класс, который будет вызывать только тот API, который мне нужен.У меня уже работает абстрактный класс (он выбирает правильный API), и у меня также работает API для SDK v3,4.У меня проблемы с получением нового API, который использует ContactsContract для работы.

Я могу получить имя контакта, но номер, который он получает, всегда является номером для идентификатора контакта ДО этого!Пример: у меня есть 2 контакта «Джон Доу» и «Джейн Доу» с соответствующими номерами «555-555-555» и «777-777-7777», добавленных в контакты.Джон Доу - ID = 1, а Джейн Доу - ID = 2.Если я попытаюсь узнать номер Джейн Доу, я получу номер Джона 555-555-5555.Если я попытаюсь достать Джона, я ничего не получу.Сбой проверки if (cursor.moveToNext ()).

Не могли бы вы помочь мне исправить это?Это сводит меня с ума.Я просмотрел много примеров и всегда получаю одну и ту же ошибку.

Данные Intent - это данные Intent из onActivityResult

 
import java.util.ArrayList;</p>

<p>import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;</p>

<p>class NewContactsAdapterBridge extends ContactsAdapterBridge {</p>

ArrayList<String> info = new ArrayList<String>();
ArrayList<String> getInfo (Activity a, Intent data) {
    Uri contactData = data.getData();

    Cursor cursor = a.managedQuery(contactData, null, null, null, null);

    if (cursor.moveToFirst()) {
        String id = cursor.getString(
                cursor.getColumnIndex(ContactsContract.Contacts._ID));

        String name = cursor.getString(cursor.getColumnIndexOrThrow
                (ContactsContract.Contacts.DISPLAY_NAME));

        String hasPhoneNumber = cursor.getString(cursor.getColumnIndexOrThrow(
                ContactsContract.Contacts.HAS_PHONE_NUMBER));
        info.add(name);

        if (Integer.parseInt(hasPhoneNumber) > 0) {
            Uri myPhoneUri = Uri.withAppendedPath(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    id);

            Cursor pCur = a.managedQuery(
                    myPhoneUri, 
            null, 
            null,
            null,
            null);
            if (pCur.moveToNext()) {
            String number = pCur.getString( pCur.getColumnIndex
                    (ContactsContract.CommonDataKinds.Phone.NUMBER));
            info.add(number);
            } 
        }
    }
    return info;
}   
}

Ответы [ 5 ]

23 голосов
/ 27 мая 2011
@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (resultCode == RESULT_OK) {  
        switch (requestCode) {  
        case CONTACT_PICKER_RESULT:
            final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput);
            Cursor cursor = null;  
            String phoneNumber = "";
            List<String> allNumbers = new ArrayList<String>();
            int phoneIdx = 0;
            try {  
                Uri result = data.getData();  
                String id = result.getLastPathSegment();  
                cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null);  
                phoneIdx = cursor.getColumnIndex(Phone.DATA);
                if (cursor.moveToFirst()) {
                    while (cursor.isAfterLast() == false) {
                        phoneNumber = cursor.getString(phoneIdx);
                        allNumbers.add(phoneNumber);
                        cursor.moveToNext();
                    }
                } else {
                    //no results actions
                }  
            } catch (Exception e) {  
               //error actions
            } finally {  
                if (cursor != null) {  
                    cursor.close();
                }

                final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]);
                AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this);
                builder.setTitle("Choose a number");
                builder.setItems(items, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int item) {
                        String selectedNumber = items[item].toString();
                        selectedNumber = selectedNumber.replace("-", "");
                        phoneInput.setText(selectedNumber);
                    }
                });
                AlertDialog alert = builder.create();
                if(allNumbers.size() > 1) {
                    alert.show();
                } else {
                    String selectedNumber = phoneNumber.toString();
                    selectedNumber = selectedNumber.replace("-", "");
                    phoneInput.setText(selectedNumber);
                }

                if (phoneNumber.length() == 0) {  
                    //no numbers found actions  
                }  
            }  
            break;  
        }  
    } else {
       //activity result error actions
    }  
}

Вам необходимо настроить это для работы с вашим приложением

4 голосов
/ 21 мая 2013
 Intent intent = new Intent(Intent.ACTION_PICK);
 intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
 startActivityForResult(intent, PICK_CONTACT); 

Этот код помогает вам, я думаю, что действие PICK возвращает только идентификатор выбранного контакта.После этого вы можете запросить поставщика контактов и, если существует несколько телефонных номеров, предложить пользователю выбрать один из них.

U может использовать это также

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (resultCode == RESULT_OK) {  
    switch (requestCode) {  
    case CONTACT_PICKER_RESULT:
        final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput);
        Cursor cursor = null;  
        String phoneNumber = "";
        List<String> allNumbers = new ArrayList<String>();
        int phoneIdx = 0;
        try {  
            Uri result = data.getData();  
            String id = result.getLastPathSegment();  
            cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null);  
            phoneIdx = cursor.getColumnIndex(Phone.DATA);
            if (cursor.moveToFirst()) {
                while (cursor.isAfterLast() == false) {
                    phoneNumber = cursor.getString(phoneIdx);
                    allNumbers.add(phoneNumber);
                    cursor.moveToNext();
                }
            } else {
                //no results actions
            }  
        } catch (Exception e) {  
           //error actions
        } finally {  
            if (cursor != null) {  
                cursor.close();
            }

            final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]);
            AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this);
            builder.setTitle("Choose a number");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    String selectedNumber = items[item].toString();
                    selectedNumber = selectedNumber.replace("-", "");
                    phoneInput.setText(selectedNumber);
                }
            });
            AlertDialog alert = builder.create();
            if(allNumbers.size() > 1) {
                alert.show();
            } else {
                String selectedNumber = phoneNumber.toString();
                selectedNumber = selectedNumber.replace("-", "");
                phoneInput.setText(selectedNumber);
            }

            if (phoneNumber.length() == 0) {  
                //no numbers found actions  
            }  
        }  
        break;  
    }  
} else {
   //activity result error actions
}  
}
4 голосов
/ 19 октября 2012

Я получаю этот случай

int PICK_CONTACT;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        b=(Button) findViewById(R.id.button1);
         et=(EditText) findViewById(R.id.editText1);
        b.setOnClickListener(this);
        //et.setOnClickListener(this);

            }

@Override
public void onClick(View v) {
    switch(v.getId())
    {
    case R.id.button1:
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
        startActivityForResult(intent, PICK_CONTACT);

        break;
   // case R.id.editText1:



      //  break;

    }
3 голосов
/ 28 апреля 2014

Доброе замечание для начинающих, не забудьте включить следующее разрешение, иначе оно не будет работать

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

0 голосов
/ 22 октября 2018
 switch (reqCode) {
        case (REQUEST_CODE_email):
            if (resultCode == Activity.RESULT_OK) {
                Uri contactData = data.getData();
                Cursor c = getContentResolver().query(contactData, null, null, null, null);
                if (c.moveToFirst()) {
                    String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                    String hasNumber = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                    String num = "";
                    if (Integer.valueOf(hasNumber) == 1) {
                        Cursor numbers = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                        while (numbers.moveToNext()) {
                            num = numbers.getString(numbers.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                            //Toast.makeText(getApplicationContext(), "Number=" + num, Toast.LENGTH_LONG).show();

                            //asdasdasdsa
                            if(getEmail(num).isEmpty()){
                                Toast.makeText(this, "Email Not Found In That Contact Try Another", Toast.LENGTH_SHORT).show();
                            }
                            else {
                                edt_email_contact.setText("" + getEmail(num));
                            }                            }
                    }
                }
                break;
            }
         case (REQUEST_CODE_number):
            if (resultCode == Activity.RESULT_OK) {
                Uri contactData = data.getData();
                Cursor c = getContentResolver().query(contactData, null, null, null, null);
                if (c.moveToFirst()) {
                    String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                    String hasNumber = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                    String num = "";
                    if (Integer.valueOf(hasNumber) == 1) {
                        Cursor numbers = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                        while (numbers.moveToNext()) {
                            num = numbers.getString(numbers.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            //Toast.makeText(getApplicationContext(), "Number=" + num, Toast.LENGTH_LONG).show();

                            //asdasdasdsa

                            edt_email_contact.setText("" + num);
                        }
                    }
                }
                break;
            }

    }
...