it-swarm-ru.tech

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

Я прочитал уже опубликованные решения, но они не говорят, как мне использовать экран контактной информации системы, чтобы выбрать любой ОДИН номер для использования? Я разрабатываю приложение для отправки SMS-сообщений для Android, которое предлагает выбрать контакты телефона и номер. пользователь хочет использовать для отправки в ....

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

С уважением

Шерри

26
sherry

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

в приложении, которое я сейчас разрабатываю, пользователь может ввести номер телефона в 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" сообщает тип номера: мобильный (2), домашний (1), рабочий (3) и т. д.

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

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

удачи.

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

55
stefs

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

@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
Shadi

В принятом ответе есть проблема . Если выбранное число содержит пробелы в нем
То есть. 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);
2
codepeaker

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

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

ПОПРОБУЙ ЭТО

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>
0
nzala