Android-使用AccountManager/手机所有者的名字和姓氏获取用户数据

Android-使用AccountManager/手机所有者的名字和姓氏获取用户数据,android,android-contacts,Android,Android Contacts,我想在我的应用程序中预填充一些字段,以帮助用户在订阅我的应用程序中的服务时获得帮助 那个么我怎样才能得到设备所有者的名字和姓氏呢。我想使用默认信息绑定到谷歌帐户;到目前为止,我得到了这个: AccountManager am = AccountManager.get(this); Account[] accounts = am.getAccounts(); for (Account account : accounts) { if (account.type.compareTo("com

我想在我的应用程序中预填充一些字段,以帮助用户在订阅我的应用程序中的服务时获得帮助

那个么我怎样才能得到设备所有者的名字和姓氏呢。我想使用默认信息绑定到谷歌帐户;到目前为止,我得到了这个:

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?
    }             
}
如果你建议的话,我愿意采取其他方法-只要我能收到电子邮件、所有者的名字和姓氏。

获取此信息很容易,因为Android包含一个代表设备所有者的个人档案-此档案被称为“我”档案并存储在表中。只要您请求AndroidManifest.xml中的
read\u profile
read\u CONTACTS
权限,就可以从用户配置文件中读取数据

对你来说,最相关的字段是联系人栏,也可能是其他字段,比如用户的联系人照片

有一个Android代码实验室教程给出,代码的核心部分在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();
Cursor c=activity.getContentResolver().query(ContactsContract.Profile.CONTENT\u URI,null,null,null);
int count=c.getCount();
String[]columnNames=c.getColumnNames();
布尔b=c.moveToFirst();
int position=c.getPosition();
如果(计数=1和位置=0){
对于(int j=0;j
不幸的是,我认为没有办法在API级别14之前获取此类数据。

以下是我是如何做到这一点的(也来自API 14):

public类main活动实现LoaderManager.LoaderCallbacks{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportLoaderManager().initLoader(0,null,this);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的游标装入器(此,
//检索设备用户“配置文件”联系人的数据行。
Uri.withAppendedPath(
contacts contract.Profile.CONTENT\u URI,
联系人Contacts.Contacts.Data.CONTENT\u目录),
ProfileQuery.PROJECTION,
//仅选择名称。
Contacts contract.Contacts.Data.MIMETYPE+“=?”,
新字符串[]{ContactsContract.CommonDataTypes.StructuredName.CONTENT\u ITEM\u TYPE},
//首先显示主字段。请注意,不会出现
//如果用户未指定主字段,则为主字段。
Contacts contract.Contacts.Data.IS_PRIMARY+“DESC”);
}
@凌驾
public void onLoadFinished(加载器,光标){
用户=新用户();
列表名称=新的ArrayList();
cursor.moveToFirst();
字符串模拟类型;
而(!cursor.isAfterLast()){
mimeType=cursor.getString(ProfileQuery.MIME\u类型);
开关(mimeType){
案例联系人contract.CommonDataTypes.StructuredName.CONTENT\u ITEM\u类型:
String name=cursor.getString(ProfileQuery.GIVEN_name)+“”+cursor.getString(ProfileQuery.FAMILY_name);
如果(!TextUtils.isEmpty(名称)){
名称。添加(名称);
}
打破
}
cursor.moveToNext();
}
如果(!names.isEmpty()){
//你想用什么名字都行
}
}
@凌驾
公共void onLoaderReset(加载器){
}
专用接口概要查询{
字符串[]投影={
Contacts contract.CommonDataTypes.StructuredName.FAMILY\u NAME,
Contacts contract.CommonDataTypes.StructuredName.GIVEN_NAME,
Contacts contract.Contacts.Data.MIMETYPE
};
/**
*配置文件查询结果中族名称的列索引
*/
int FAMILY_NAME=0;
/**
*配置文件查询结果中给定名称的列索引
*/
给定的int_NAME=1;
/**
*配置文件查询结果中MIME类型的列索引
*/
int MIME_TYPE=2;
}
并且应该有以下权限:

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


这很好,但我不认为有任何保证“我”的个人资料会被填充。@gcl1确实没有保证,这就是为什么如果你的个人资料没有设置,你需要从客户经理那里获取姓名。我只能获取
帐户.name
这是我的电子邮件,而不是名字和姓氏。知道吗?
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />