Как позвонить в список контактов Android И выбрать один номер телефона со своего экрана сведений?
Я прочитал уже опубликованные решения, но они не рассказывают, как использовать экран сведений о контактах системы, чтобы выбрать любой номер ONE для использования?
Я разрабатываю приложение отправки sms-отправлений, которое предлагает выбрать контакты телефона и номер, который пользователь хочет использовать для отправки.
До сих пор я не мог найти ничего о том, чтобы выбрать какой-либо номер. Нужно ли это делать только программно? получение всех номеров из базы данных и отправка смс на него?
Привет
Шерри
Ответы
Ответ 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
//...
}
}
}