Как получить имя и фамилию из контактов Android?
Как получить следующие поля из контактов Android? Я использовал Android 2.2.
- Имя префикса
- Имя
- Второе имя
- Фамилия
- Имя префикса
- Фонетическое имя
- Фонетическое отчество
- Фонетическая фамилия
10 ответов
Смотреть на ContactsContract.CommonDataKinds.StructuredName
учебный класс. Вы можете найти там все столбцы, которые вы ищете. Попробуйте что-то вроде этого:
String whereName = ContactsContract.Data.MIMETYPE + " = ?";
String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE };
Cursor nameCur = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCur.moveToNext()) {
String given = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
}
nameCur.close();
Возвращает все имена в контактах. Чтобы быть более точным, вы можете добавить идентификатор контакта в качестве дополнительного параметра к запросу - вы получите адрес для конкретного контакта.
Для указанного контакта вы можете сделать это:
String whereName = ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?";
String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contact_ID };
Cursor nameCur = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCur.moveToNext()) {
String given = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
}
nameCur.close();
Как другой пример (просто для удовольствия), но для получения имени контакта одного пользователя:
// A contact ID is fetched from ContactList
Uri resultUri = data.getData();
Cursor cont = getContentResolver().query(resultUri, null, null, null, null);
if (!cont.moveToNext()) {
Toast.makeText(this, "Cursor contains no data", Toast.LENGTH_LONG).show();
return;
}
int columnIndexForId = cont.getColumnIndex(ContactsContract.Contacts._ID);
String contactId = cont.getString(columnIndexForId);
// Fetch contact name with a specific ID
String whereName = ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = " + contactId;
String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE };
Cursor nameCur = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCur.moveToNext()) {
String given = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
Toast.makeText(this, "Name: " + given + " Family: " + family + " Displayname: " + display, Toast.LENGTH_LONG).show();
}
nameCur.close();
cont.close();
Попробуйте использовать этот код, чтобы получить необходимую информацию о контакте, код здесь
import android.provider.ContactsContract.Contacts;
import android.database.Cursor;
// Form an array specifying which columns to return, you can add more.
String[] projection = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone
ContactsContract.CommonDataKinds.Email
};
Uri contacts = ContactsContract.Contacts.CONTENT_LOOKUP_URI;
// id of the Contact to return.
long id = 3;
// Make the query.
Cursor managedCursor = managedQuery(contacts,
projection, // Which columns to return
null, // Which rows to return (all rows)
// Selection arguments (with a given ID)
ContactsContract.Contacts._ID = "id",
// Put the results in ascending order by name
ContactsContract.Contacts.DISPLAY_NAME + " ASC");
Некоторые ссылки для начала, в дополнение к предложениям Раунака:
Экспериментируя с ContactsContract.Data.CONTENT_URI
в конце 2015 года на зефир. Я не могу получить GIVEN_NAME
или аналогичные поля. Я думаю, что более поздние apis устарели эти. Запустите следующий код, чтобы распечатать столбцы на вашем телефоне
Uri uri = ContactsContract.Data.CONTENT_URI;
String selection = ContactsContract.Data.MIMETYPE + " = ?";
String[] selectionArgs = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
Cursor cursor = contentResolver.query(
uri, // URI representing the table/resource to be queried
null, // projection - the list of columns to return. Null means "all"
selection, // selection - Which rows to return (condition rows must match)
selectionArgs, // selection args - can be provided separately and subbed into selection.
null); // string specifying sort order
if (cursor.getCount() == 0) {
return;
}
Log.i("Count:", Integer.toString(cursor.getCount())); // returns number of names on phone
while (cursor.moveToNext()) {
// Behold, the firehose!
Log.d(TAG, "-------------------new record\n");
for(String column : cursor.getColumnNames()) {
Log.d(TAG, column + ": " + cursor.getString(cursor.getColumnIndex(column)) + "\n");
}
}
Android Контакты только что ВОЗРОЖДЕНИЕ ! Используя , ответ на исходный вопрос,
Как получить следующие поля из контактов Android? Я использовал Android2.2.
- Префикс имени
- Имя
- Второе имя
- Фамилия
- Суффикс)
- Фонетическое имя
- Фонетическое отчество
- Фонетическая фамилия
следующее ...
Предполагая, что вы больше не используете Android 2.2 и обновились до Android 4.4 и выше ...
В Java
public void printAllContactsStructuredName(Context context) {
Contacts contactsApi = ContactsFactory.create(context);
List<Contact> contacts = contactsApi
.query()
.include(Fields.Name.getAll())
.find();
for (Contact contact: contacts) {
// Assuming this Contact only has 1 RawContact
Name name = contact.getRawContacts().get(0).getName();
Log.d(
"Contact",
"Prefix: " + name.getPrefix() +
", First name: " + name.getGivenName() +
", Middle name: " + name.getMiddleName() +
", Last name: " + name.getFamilyName() +
", Name suffix: " + name.getSuffix() +
", Phonetic given name: " + name.getPhoneticGivenName() +
", Phonetic middle name: " + name.getPhoneticMiddleName() +
", Phonetic family name: " + name.getPhoneticFamilyName()
);
}
}
В Котлине,
fun printAllContactsStructuredName(context: Context) {
Contacts(context)
.query()
.include(Fields.Name.all)
.find()
.forEach { contact ->
// Assuming this Contact only has 1 RawContact
val name = contact.rawContacts.first().name
Log.d(
"Contact",
"""
Prefix: ${name?.prefix}
First name: ${name?.givenName}
Middle name: ${name?.middleName}
Last name: ${name?.familyName}
Suffix: ${name?.suffix}
Phonetic given name: ${name?.phoneticGivenName}
Phonetic middle name: ${name?.phoneticMiddleName}
Phonetic family name: ${name?.phoneticFamilyName}
""".trimIndent()
)
}
}
Вы можете сделать гораздо больше, используя Контакты, Reborn APIКонтакты, Reborn API . Вы даже можете создать собственное полноценное приложение «Контакты», которое будет соответствовать тому, которое поставляется практически с каждой копией Android.
Попробуй это,
public void onActivityResult(int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data);
try {
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor cur = managedQuery(contactData, null, null, null, null);
ContentResolver contect_resolver = getContentResolver();
if (cur.moveToFirst()) {
String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String name = "";
String no = "";
Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
if (phoneCur.moveToFirst()) {
name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
Log.e("Phone no & name :***: ", name + " : " + no);
txt.append(name + " : " + no + "\n");
id = null;
name = null;
no = null;
phoneCur = null;
}
contect_resolver = null;
cur = null;
// populateContacts();
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
Log.e("IllegalArgumentException::", e.toString());
} catch (Exception e) {
e.printStackTrace();
Log.e("Error :: ", e.toString());
}
}
Комбинируя здесь различные решения и видя, что в результатах есть повторяющиеся записи (из-за нескольких учетных записей), я решил создать функцию, которая будет отдавать приоритет общим типам учетных записей над другими. В этом примере я также игнорирую записи с полностью пустыми / нулевыми именами (если все таковые), но вы можете изменить это, если хотите:
@RequiresPermission(
allOf = [Manifest.permission.READ_CONTACTS])
@WorkerThread
fun getContactIdToContactNameMap(context: Context): LongSparseArray<ContactObject> {
val contactIdToContactObjectMap = LongSparseArray<ContactObject>()
val contentResolver = context.contentResolver
contentResolver.query(ContactsContract.Data.CONTENT_URI,
arrayOf(
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID,
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME,
ContactsContract.RawContacts.ACCOUNT_TYPE),
ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.Data.IN_VISIBLE_GROUP + " = ?",
arrayOf(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, "1"),
null)?.use { cursor ->
// Log.d("AppLog", "got ${cursor.count} records for names")
val colContactId = cursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID)
val colFirstName = cursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)
val colFamilyName = cursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)
val colMiddleName = cursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)
val colAccountType =
cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)
val googleAccount = "com.google"
//https://stackoverflow.com/a/44802016/878126
val prioritizedAccountTypes =
hashSetOf("vnd.sec.contact.phone", "com.htc.android.pcsc",
"com.sonyericsson.localcontacts", "com.lge.sync", "com.lge.phone",
"vnd.tmobileus.contact.phone", "com.android.huawei.phone",
"Local Phone Account",
"")
val contactIdToAccountTypeMap = LongSparseArray<String>()
while (cursor.moveToNext()) {
val contactId = cursor.getLong(colContactId)
val accountType = cursor.getString(colAccountType).orEmpty()
val existingContact = contactIdToContactObjectMap.get(contactId)
if (existingContact != null) {
//this can occur, as we go over all of the items, including duplicate ones made by various sources
// https://stackoverflow.com/a/4599474/878126
val previousAccountType = contactIdToAccountTypeMap.get(contactId)
//google account is most prioritized, so we skip current one if previous was of it
if (previousAccountType == googleAccount)
continue
if (accountType != googleAccount && previousAccountType != null && prioritizedAccountTypes.contains(
previousAccountType))
//we got now a name of an account that isn't prioritized, but we already had a prioritized one, so ignore
continue
}
contactIdToAccountTypeMap.put(contactId, accountType)
val firstName = cursor.getString(colFirstName)?.trim()
val lastName = cursor.getString(colFamilyName)?.trim()
val middleName = cursor.getString(colMiddleName)?.trim()
if (firstName.isNullOrBlank() && lastName.isNullOrBlank() && middleName.isNullOrBlank())
continue
val contactObject = existingContact ?: ContactObject()
contactObject.firstName = firstName
contactObject.lastName = lastName
contactObject.middleName = middleName
contactIdToContactObjectMap.put(contactId, contactObject)
}
}
return contactIdToContactObjectMap
}
class ContactObject {
var firstName: String? = null
var middleName: String? = null
var lastName: String? = null
}
Использование:
thread {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
val contactIdToContactNameMap = getContactIdToContactNameMap(this)
Log.d("AppLog", "found ${contactIdToContactNameMap.size()} names for contacts")
} else Log.d("AppLog", "no contacts permission...")
}
Проверьте здесь, есть пример кода именно для этого: http://developer.android.com/guide/topics/ui/layout/listview.html