2011-09-09 11 views
14

私のアプリケーション内のサービスを購読するときに役立ついくつかのフィールドをアプリケーションにあらかじめ用意しておきたい。Android - アカウントマネージャーを使用してUserDataを取得する/電話所有者の姓と名字

どのようにしてデバイスの所有者の名と姓を取得できますか? Googleアカウントに関連付けられたデフォルトの情報を使用したいと思います。ちょうど限り、私は、電子メール、FIRSTNAMEと所有者の姓を得ることができるよう - 私はあなたがそれらを示唆している場合、代替的なアプローチを取って喜んで

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

:これまでのところ、私はこれを得ました。

答えて

23

Ice Cream Sandwichこの情報を取得するのは簡単です。Androidには、デバイスの所有者を表す個人用プロファイルが含まれています。このプロファイルは「Me」プロファイルと呼ばれ、ContactsContract.Profileテーブルに格納されています。 AndroidManifest.xmlのREAD_PROFILEREAD_CONTACTSのアクセス権を要求している限り、ユーザーのプロファイルからデータを読み取ることができます。

最も関連性の高いフィールドは、連絡先からのDISPLAY_NAME列、場合によってはStructuredNameフィールドです(ユーザーの連絡先写真なども利用可能です)。

コードのコアビットはListProfileTaskで、a full example of reading a user's profileというAndroidコードラボのチュートリアルがあります。私は残念ながら、APIレベル14の前にこの種のデータを取得する方法はないと思う

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(); 

:ここに要約抜粋です。ここで

+1

これは良いですが、私はそのいずれかの保証はないと思います「Me」プロファイルが入力されます。 – gcl1

+2

@ gcl1確かに保証はありません。あなたのプロフィールがSETでない場合、あなたはアカウントマネージャーから名前を取得する必要があります。 – amar

+0

「account.name」は私の電子メールであり、名字ではありません。何か案が? – Si8

1

は、私は(も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" /> 
関連する問題