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?
}
}
Я желаю использовать альтернативные подходы, если вы им предлагаете - до тех пор, пока я могу получить электронную почту, имя и фамилию владельца.
Ответы
Ответ 1
В Ice Cream Sandwich получить эту информацию легко, так как Android включает персональный профиль, который представляет владельца устройства - этот профиль известен как профиль "Me" и хранится в таблице 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. К сожалению,
Ответ 2
Вот как я это сделал (также из 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 '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" />