Dưới đây là làm thế nào tôi đã làm điều đó (cũng từ 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;
}
Và cần có điều khoản:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
này là tốt, nhưng tôi không nghĩ rằng có bất kỳ sự đảm bảo rằng tiểu sử "Tôi" được điền. – gcl1
@ gcl1 Thật vậy, không có sự đảm bảo nào và đó là lý do tại sao nếu hồ sơ của bạn không phải là SET, bạn cần lấy tên từ người quản lý tài khoản. – amar
Tôi chỉ có thể nhận được 'account.name' là email của tôi chứ không phải là họ và tên. Bất kỳ ý tưởng? – Si8