Подтвердить что ты не робот

Как выбрать номер телефона в диалоговом окне контактов Android

Я использую старый API контактов для выбора контакта с номером телефона. Я хочу использовать новый API ContactsContracts. Я хочу...

  • ... диалоговое окно со всеми контактами, имеющими номера телефонов.
  • ... пользователь может выбрать контакт и один из своих телефонных номеров.
  • ... доступ к выбранному номеру телефона.

Контакты Contacts очень сложны. Я нашел много примеров, но ни один из них не соответствовал моим потребностям. Я не хочу выбирать контакт, а затем запрашивать контактные данные, потому что это даст мне список их телефонных номеров. Мне нужен пользователь, чтобы выбрать ОДИН из контактных телефонов. Я не хочу писать свои собственные диалоги для отображения контактов или для того, чтобы пользователь мог выбрать номер телефона. Есть ли простой способ получить то, что я хочу?

Вот старый код API, который я использую:

static public final int CONTACT = 0;
...
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.Phones.CONTENT_URI);
startActivityForResult(intent, CONTACT);
...
public void onActivityResult (int requestCode, int resultCode, Intent intent) {
  if (resultCode != Activity.RESULT_OK || requestCode != CONTACT) return;
  Cursor c = managedQuery(intent.getData(), null, null, null, null);
  if (c.moveToFirst()) {
     String phone = c.getString(c.getColumnIndexOrThrow(Contacts.Phones.NUMBER));
     // yay
  }
}      
4b9b3361

Ответ 1

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


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


U также может использовать это (обновлено):

      public void readcontact(){
    try {
        Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people"));
        startActivityForResult(intent, PICK_CONTACT);
    } catch (Exception e) {
            e.printStackTrace();
      }
}

public void onActivityResult(int reqCode, int resultCode, Intent data) {
      super.onActivityResult(reqCode, resultCode, data);

      switch (reqCode) {
        case (PICK_CONTACT) :
          if (resultCode == Activity.RESULT_OK) {
              Uri contactData = data.getData();
                Cursor c =  managedQuery(contactData, null, null, null, null);
                startManagingCursor(c);
                if (c.moveToFirst()) {
                  String name = c.getString(c.getColumnIndexOrThrow(People.NAME));  
                  String number = c.getString(c.getColumnIndexOrThrow(People.NUMBER));
                  perrsonname.setText(name);
                  Toast.makeText(this,  name + " has number " + number, Toast.LENGTH_LONG).show();
                 }
           }
         break;
      }

  }


Привет, обновленный контент от 28/12:  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
    }  
}

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

Ответ 2

Здесь вы можете найти отличный код от: http://developer.android.com/training/basics/intents/result.html

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            String[] projection = {Phone.NUMBER};

            // Perform the query on the contact to get the NUMBER column
            // We don't need a selection or sort order (there only one result for the given URI)
            // CAUTION: The query() method should be called from a separate thread to avoid blocking
            // your app UI thread. (For simplicity of the sample, this code doesn't do that.)
            // Consider using CursorLoader to perform the query.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Retrieve the phone number from the NUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // Do something with the phone number...
        }
    }
}

Ответ 3

Из более старых ответов и моих собственных тестов я закончил использовать это:

список контактов для запуска:

import android.content.Intent;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;

...

public static final int PICK_CONTACT = 100;

...

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
intent.setType(Phone.CONTENT_TYPE);  //should filter only contacts with phone numbers
startActivityForResult(intent, PICK_CONTACT);

onActivityResult обработчик:

private static final String[] phoneProjection = new String[] { Phone.DATA };

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (PICK_CONTACT != requestCode || RESULT_OK != resultCode) return;
    Uri contactUri = data.getData();
    if (null == contactUri) return;
    //no tampering with Uri makes this to work without READ_CONTACTS permission
    Cursor cursor = getContentResolver().query(contactUri, phoneProjection, null, null, null);
    if (null == cursor) return;
    try {
        while (cursor.moveToNext()) {
            String number = cursor.getString(0);
            // ... use "number" as you wish
        }
    } finally {
        cursor.close();
    }
    // "cursor" is closed here already
}

Так в чем отличия от Ризвана?

На моем тестирующем устройстве (Samsung S3):

  • приложение НЕ нуждается в READ_CONTACS разрешении (потому что я использую возвращенный uri как есть, когда я использую только его "id" и создаю тип запроса ID =?, происходит сбой разрешения)
  • Когда контакт имеет несколько телефонных номеров, сам сборщик отображает диалог, чтобы выбрать только один из них, затем он возвращает uri, который ведет непосредственно к этому единственному выбранному номеру
  • даже если какой-либо телефон вернет uri на несколько номеров, предлагаемый обработчик onActivityResult может быть расширен, чтобы прочитать их все, и вы можете сделать свой собственный диалог выбора.

Таким образом, это выглядит так, как будто он идеально подходит для того, что спросил OP.

Теперь я просто задаюсь вопросом:

Сообщите мне, если у вас есть реальный опыт в мире, спасибо.

Обновление: HTC Desire S, пользовательский ром с android 4.0.3 → имеет обе проблемы, требует разрешения READ_CONTACTS для работы и возвращает несколько номеров без дополнительного диалогового окна выбора.