2011年9月28日水曜日

Google アカウントを使用して Google App Engine の認証を行う

AccountManager から、端末に登録されているGoogleアカウントを取得して、
そのアカウントでGoogle App Engineの認証を行う簡単なサンプルです。


AndroidManifest.xmlは、次のパーミッションを指定します。

  • android.permission.GET_ACCOUNTS
  • android.permission.MANAGE_ACCOUNTS
  • android.permission.USE_CREDENTIALS

  1. <!--xml version="1.0" encoding="utf-8"?-->  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.granoeste.creador.AuthenticatorTest" android:versioncode="1" android:versionname="1.0">  
  3.   <uses-sdk android:minsdkversion="7">  
  4.   
  5.   <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission>  
  6.   <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"></uses-permission>  
  7.   <uses-permission android:name="android.permission.USE_CREDENTIALS"></uses-permission>  
  8.   
  9.   <application android:icon="@drawable/icon" android:label="@string/app_name">  
  10.     <activity android:label="@string/app_name" android:name="AccountList">  
  11.       <intent-filter>  
  12.         <action android:name="android.intent.action.MAIN">  
  13.         <category android:name="android.intent.category.LAUNCHER">  
  14.       </category></action></intent-filter>  
  15.     </activity>  
  16.   
  17.   </application>  
  18. </uses-sdk></manifest>  



Activity


AccountManagerから、AccountsByTypeに"com.google"を指定して、Googleアカウントの一覧を取得します。
それをリスト表示してます。
※リストは簡易的に標準のレイアウトを使用してます。

  1. public class AccountList extends ListActivity {  
  2.     protected AccountManager accountManager;  
  3.     protected Intent intent;  
  4.   
  5.     /** Called when the activity is first created. */  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         accountManager = AccountManager.get(getApplicationContext());  
  10.         Account[] accounts = accountManager.getAccountsByType("com.google");  
  11.         this.setListAdapter(new ArrayAdapter<account>(  
  12.                          this, android.R.layout.simple_list_item_1, accounts));  
  13.     }  
  14.   
  15.     @Override  
  16.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  17.         Account account = (Account)getListView().getItemAtPosition(position);  
  18.         AccountManagerFuture<bundle> accountManagerFuture =   
  19.             accountManager.getAuthToken(account, "ah"nullthisnullnull);  
  20.         Bundle authTokenBundle;  
  21.         try {  
  22.             authTokenBundle = accountManagerFuture.getResult();  
  23.             String authToken = authTokenBundle.get(  
  24.                                    AccountManager.KEY_AUTHTOKEN).toString();  
  25.             Log.i(TAG,"authToken:"+authToken);  
  26.   
  27.         } catch (OperationCanceledException e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         } catch (AuthenticatorException e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         } catch (IOException e) {  
  34.             // TODO Auto-generated catch block  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  
  39. </bundle></account>  

リストで選んだAccountでGoogle App Engineの認証を行ってます。
AccountManager#getAuthToken() の 第2引数に AuthTokenTypeを指定します。
"ah"がGoogle App EngineのAuthTokenTypeとなってます。

AuthTokenTypeについては、次のサイトが参考になると思います。
  Account Managerについて - adsaria mood
  Google Data APIs Frequently Asked Questions - Google Base Data API - Google Code

認証画面が表示されます。

ユーザがAllowを選択するとauthTokenを取得することができます。


0 件のコメント:

コメントを投稿