Android – Получить UserData с помощью AccountManager / Имя и фамилия владельца телефона

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

Итак, как бы я получил имя и фамилию владельца устройства. Я хочу использовать информацию по умолчанию, привязанную к учетной записи Google; До сих пор я получил это:

AccountManager am = AccountManager.get(this); Account[] accounts = am.getAccounts(); for (Account account : accounts) { if (account.type.compareTo("com.google") == 0) { String possibleEmail = account.name; // how to get firstname and lastname here? } } 

Я готов принять альтернативные подходы, если вы их предложите, – до тех пор, пока я могу получить электронную почту, имя и фамилию владельца.

Solutions Collecting From Web of "Android – Получить UserData с помощью AccountManager / Имя и фамилия владельца телефона"

В Ice Cream Sandwich получение этой информации легко, так как Android включает персональный профиль, который представляет владельца устройства – этот профиль известен как профиль «Me» и хранится в таблице ContactsContract.Profile . Вы можете читать данные из профиля пользователя, пока вы запрашиваете READ_PROFILE и READ_CONTACTS в вашем AndroidManifest.xml.

Наиболее подходящими для вас являются столбцы DISPLAY_NAME из полей «Контакт» и, возможно, « Структурированное имя», также доступны такие данные, как контактная фотография пользователя.

Существует учебное пособие по программе Android Code Lab, которое дает полный пример чтения профиля пользователя , основной бит кода находится в ListProfileTask . Вот сокращенный фрагмент:

 Cursor c = activity.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null); int count = c.getCount(); String[] columnNames = c.getColumnNames(); boolean b = c.moveToFirst(); int position = c.getPosition(); if (count == 1 && position == 0) { for (int j = 0; j < columnNames.length; j++) { String columnName = columnNames[j]; String columnValue = c.getString(c.getColumnIndex(columnName))); ... // consume the values here } } c.close(); 

Я не думаю, что есть способ получить данные такого типа до уровня API-уровня 14, к сожалению.

Вот как я это сделал (также из api 14):

 public class MainActivity implements LoaderManager.LoaderCallbacks<Cursor> { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportLoaderManager().initLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(this, // Retrieve data rows for the device user's 'profile' contact. Uri.withAppendedPath( ContactsContract.Profile.CONTENT_URI, ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, // Select only name. ContactsContract.Contacts.Data.MIMETYPE + "=?", new String[]{ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}, // Show primary fields first. Note that there won't be // a primary fields if the user hasn't specified one. ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { User user = new User(); List<String> names = new ArrayList<>(); cursor.moveToFirst(); String mimeType; while (!cursor.isAfterLast()) { mimeType = cursor.getString(ProfileQuery.MIME_TYPE); switch (mimeType) { case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE: String name = cursor.getString(ProfileQuery.GIVEN_NAME) + " " + cursor.getString(ProfileQuery.FAMILY_NAME); if (!TextUtils.isEmpty(name)) { names.add(name); } break; } cursor.moveToNext(); } if (!names.isEmpty()) { // do with names whatever you want } } @Override public void onLoaderReset(Loader<Cursor> loader) { } private interface ProfileQuery { String[] PROJECTION = { ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.Contacts.Data.MIMETYPE }; /** * Column index for the family name in the profile query results */ int FAMILY_NAME = 0; /** * Column index for the given name in the profile query results */ int GIVEN_NAME = 1; /** * Column index for the MIME type in the profile query results */ int MIME_TYPE = 2; } 

И должны быть разрешения:

 <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" />