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?
    }             
}

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

2 ответа

Решение

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

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

Существует учебник по 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" />
Другие вопросы по тегам