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

Как позвонить в список контактов Android И выбрать один номер телефона со своего экрана сведений?

Я прочитал уже опубликованные решения, но они не рассказывают, как использовать экран сведений о контактах системы, чтобы выбрать любой номер ONE для использования? Я разрабатываю приложение отправки sms-отправлений, которое предлагает выбрать контакты телефона и номер, который пользователь хочет использовать для отправки.

До сих пор я не мог найти ничего о том, чтобы выбрать какой-либо номер. Нужно ли это делать только программно? получение всех номеров из базы данных и отправка смс на него?

Привет

Шерри

4b9b3361

Ответ 1

phew, мне потребовалось некоторое время, но я думаю, что у меня есть ответ, который вам нужен (даже если это уже слишком поздно, но я все равно опубликую его как ссылку для других).

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact_picker);

    // this opens the activity. note the  Intent.ACTION_GET_CONTENT
    // and the intent.setType
    ((Button)findViewById(R.id.pick_person)).setOnClickListener( new OnClickListener() {
        @Override
        public void onClick(View v) {
            // user BoD suggests using Intent.ACTION_PICK instead of .ACTION_GET_CONTENT to avoid the chooser
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // BoD con't: CONTENT_TYPE instead of CONTENT_ITEM_TYPE
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            startActivityForResult(intent, 1);                
        }
    });
}

теперь, как только пользователь выбирает контакт (и, вероятно, выбирает один из нескольких телефонных номеров), вы можете получить данные обычным способом:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data != null) {
        Uri uri = data.getData();

        if (uri != null) {
            Cursor c = null;
            try {
                c = getContentResolver().query(uri, new String[]{ 
                            ContactsContract.CommonDataKinds.Phone.NUMBER,  
                            ContactsContract.CommonDataKinds.Phone.TYPE },
                        null, null, null);

                if (c != null && c.moveToFirst()) {
                    String number = c.getString(0);
                    int type = c.getInt(1);
                    showSelectedNumber(type, number);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }
        }
    }
}

public void showSelectedNumber(int type, String number) {
    Toast.makeText(this, type + ": " + number, Toast.LENGTH_LONG).show();      
}

здесь документация для CommonDataKinds.Phone для dev.android.

int "type" сообщает вам тип номера: mobile (2), home (1), work (3) и т.д.

Примечание: после того, как пользователь выбирает контакт, он получает счетчик чисел без указания типа номера. это не очень удобно: если у контакта есть 5 назначенных номеров... uh, какой из них снова номер факса?

другое примечание: выше пример нужен sdk > 5 (Android 2.0+), поэтому нет 1.6 (= sdk 4). 1.6 имеет другой api, и если вы хотите поддерживать обе версии, прочитайте статью о API контактов на dev.android.

удачи.

Отказ от ответственности: я скопировал большую часть моего кода из примера PickContact.java

Ответ 2

этот код просто отлично работает со мной

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub

    Intent i = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    super.startActivityForResult(i, 1001);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case 1001:

        if (resultCode == Activity.RESULT_OK) {

            Cursor s = getContentResolver().query(Phone.CONTENT_URI, null,
                    null, null, null);

        if (s.moveToFirst()) {
                String phoneNum = s.getString(s.getColumnIndex(Phone.NUMBER));
                Toast.makeText(getBaseContext(), phoneNum, Toast.LENGTH_LONG).show();
                            }

        }

        break;

    }

}

Ответ 3

Попробуйте этот код, я уверен, что он будет работать

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

Ответ 4

В принятом ответе есть проблема. Если выбранное число содержит пробелы внутри него
т.е. 85 29 948789 то он покажет только 85 (до первого места).

поэтому используйте приведенный ниже код, чтобы исправить эту проблему:)

Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
            startActivityForResult(intent1, 1);

и в onActivityResult

    Uri contactUri = data.getData();

    String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};


    Cursor cursor = getContentResolver()
            .query(contactUri, projection, null, null, null);
    cursor.moveToFirst();


    int numberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    int nameColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
    String number = cursor.getString(numberColumn);
    String name = cursor.getString(nameColumn);

Ответ 5

ПОПРОБУЙТЕ ЭТО

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="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="vertical" >

      <Button
        android:id="@+id/pickcontact"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Pick Contact" />

      <TextView
       android:id="@+id/contactnumber"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content" />

 </LinearLayout>

Ответ 6

У меня есть несколько кодов об этом на SO, но в конце я реализую код с сайта руководства Android для https://developer.android.com/guide/components/intents-common#PickContactDat. Я попробовал код, и мне не нужно реализовывать какие-либо запросы разрешения во время выполнения, такие как READ_CONTACTS.

static final int REQUEST_SELECT_PHONE_NUMBER = 1;

public void selectContact() {
    // Start an activity for the user to pick a phone number from contacts
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
        // Get the URI and query the content provider for the phone number
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);
        // If the cursor returned is valid, get the phone number
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            // Do something with the phone number
            //...
        }
    }
}