スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Android: Google Tasksを操作

 GoogleTasks(日本名はToDoリスト?)というのをご存知ですか?
カレンダー(GoogleCalendar)の右横にひっそりとたたずんでる、ToDoリストと言われるやつです。
こいつを、Android携帯で操作しようという試みです。
操作は、ベタにHTTPGETです。

本当は専用ライブラリを使いたかったんですが、操作方法が全くわからない。。。

ちなみに、接続の認証はGoogleAPIというのを使ってます。
この認証に関しては、過去の記事「Android: Google APIの認証」参考にしてください。
※ ベタな接続(POST接続)でも問題ないです。

また、API Keyという、プログラムでGoogleサービスを利用するためのキーを設定する必要があります。
(以下の0番ご参考)



★☆ 注意点! ☆★
・ターゲットを、Android2.2以上(Platformが8以上)でプロジェクト作成。
・TargetNameを、「Google APIs(Platform=8以上)」でプロジェクト作成。「Android 2.2」とかだと、失敗します。
・ネット接続とかGoogleAccountを利用したりするので、Manifestにパーミッションを書き入れる
↑これは、認証部分で必要な箇所です。(自分が忘れないようにココに書き足しときました)



■■■■■■■■■■■■■■■■■■■■■■■
 GoogleTasksの実装
■■■■■■■■■■■■■■■■■■■■■■■

-----------------------------------------------
0.API Keyの入手
-----------------------------------------------

GoogleTasksを使うため、Google ConsoleからAPIKeyを入手する必要があります。
簡単な流れは、
  • https://code.google.com/apis/console/ にアクセス
  • 左の一覧から「Services」を選択
  • Tasks APIを「On」にする
  • 左の一覧から「API Access」を選択
  • そこにあらわれる「API Key」をメモる
といった手順です。
詳細は、「Google API Key Console」などのキーワードでググってみてください。

-----------------------------------------------
1.プロジェクトの新規作成
-----------------------------------------------
Eclipseで、プロジェクトを新規作成します。
ちなみに、私は以下の設定で作りました。
  • Target Name:Google APIs(Platform=8)
  • アプリケーション名:TestGoogleTasks
  • パッケージ名:com.fxscore.testgoogletasks
  • Activity名:TestGoogleTasksActivity
  • Minimum SDK:8

-----------------------------------------------
2.認証部分の仕込み
-----------------------------------------------
過去の記事「Android: Google APIの認証」ご参考にしてください。
マニュフェストにパーミッションを追加したり、OnCreateを改造したり、です。
まずは、一旦ここでテスト実行してみることをオススメします。

-----------------------------------------------
3.プログラム修正1:取得する関数部分の作成
-----------------------------------------------
OnCreateの中ではありません。
OnCreateの外に、以下のように記述してください。
また、上の0番で取得したAPIキーを自分のものに書き換えてください。
ちなみに、貼り付け直後は赤波線がうじゃうじゃ出てきます。これは、ライブラリがインポートされてないからで、マウスを近づけ“Import”をしこしこ選択してください。

<注意>なぜか、「JSONObject」だけは、マウスを近づけても“Import”が出てきませんでした。
もしそうなったら、手動で上の方(Import部分)に「import org.json.JSONObject;」と書き足してください。
    private void GetTasksList(String token){
    
        String url = "https://www.googleapis.com/tasks/v1/users/@me/lists?key=■■■自分のAPIKEY■■■";
        
        try
        {
            //Getで接続(ヘッダの設定)
            HttpGet hg = new HttpGet( url );
            hg.setHeader( "Authorization", "GoogleLogin auth=" + token) ;
            hg.setHeader( "Content-Type", "application/json" );
    
            //接続
            DefaultHttpClient cl = new DefaultHttpClient();
            HttpResponse rsp = cl.execute( hg );
            
            //ステータス判定
            int status = rsp.getStatusLine().getStatusCode();
            if ( status == HttpStatus.SC_OK ) {
                //戻り値取得
                String entity = EntityUtils.toString(rsp.getEntity());
    
                //JSONで扱えるよう、ちょっと加工
                entity = "["+entity+"]";
                //JSONデータの操作
                JSONArray jsons;
                try {
                    jsons = new JSONArray(entity);
                    for (int i = 0; i < jsons.length(); i++) {
                        JSONObject jsonObj = jsons.getJSONObject(i);
                        //各要素をログに吐き出す
                        Log.d("kind", jsonObj.getString("kind")) ;
                        Log.d("etag", jsonObj.getString("etag")) ;
                        //itemsがコアな部分→JSONで再分解
                        JSONArray jsons2 ;
                        jsons2  = new JSONArray(jsonObj.getString("items"));
                        for (int j = 0; j < jsons2.length(); j++) {
                            JSONObject jsonObj2 = jsons2.getJSONObject(j);
                            Log.d("id", jsonObj2.getString("id")) ;
                            Log.d("title", jsonObj2.getString("title")) ;
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.d("ERR", "Connection Error ?");
            }
        }
        catch ( Exception e )
        {
            Log.d("ERR", "Error"+e.toString());
        }
    }

-----------------------------------------------
3.プログラム修正2:関数の呼び出し
-----------------------------------------------
あとは、Tokenを発行した直後に以下の1文を付け足すだけです。
  • GetTasksList(bundle.getString(入手したトークン);
以上です。



■■■■■■■■■■■■■■■■■■■■■■■
 Sample Program
■■■■■■■■■■■■■■■■■■■■■■■
package com.fxscore.testgoogletasks;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class TestGoogleTasksActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        // Googleアカウントの検索
        AccountManager mAccountManager = null;
        Account[] accounts = null;
        if (mAccountManager == null) mAccountManager = AccountManager.get(this);
        accounts = mAccountManager.getAccountsByType("com.google");
        for (Account ac : accounts) Log.d("G_Acc", ac.toString());
        
        AccountManagerFuture<Bundle> accountManagerFuture = 
                mAccountManager.getAuthToken(accounts[0], 
                        "cl",         // Google Calendar
                        false, new GetAuthTokenCallback(), null);        
    }
    
    
    private class GetAuthTokenCallback implements AccountManagerCallback<Bundle> {
        @Override
        public void run(AccountManagerFuture<Bundle> arg0) {
            Bundle bundle;
            try {
                bundle = arg0.getResult();
                Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT);
                if (intent != null) {
                    Toast.makeText(TestGoogleTasksActivity.this, "Click 'Allow' and restart this App", Toast.LENGTH_LONG).show();
                    startActivity(intent); //許可画面を出す
                } else {
                    //Tasksに登録されているリストを出すための関数を呼ぶ
                    GetTasksList(bundle.getString(AccountManager.KEY_AUTHTOKEN));
                }
            } catch (OperationCanceledException e) {
                e.printStackTrace();
            } catch (AuthenticatorException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 
    }
    
    
    private void GetTasksList(String token){
    
        String url = "https://www.googleapis.com/tasks/v1/users/@me/lists?key=■■■自分のAPIKEY■■■";
        
        try
        {
            //Getで接続(ヘッダの設定)
            HttpGet hg = new HttpGet( url );
            hg.setHeader( "Authorization", "GoogleLogin auth=" + token) ;
            hg.setHeader( "Content-Type", "application/json" );
    
            //接続
            DefaultHttpClient cl = new DefaultHttpClient();
            HttpResponse rsp = cl.execute( hg );
            
            //ステータス判定
            int status = rsp.getStatusLine().getStatusCode();
            if ( status == HttpStatus.SC_OK ) {
                //戻り値取得
                String entity = EntityUtils.toString(rsp.getEntity());
    
                //JSONで扱えるよう、ちょっと加工
                entity = "["+entity+"]";
                //JSONデータの操作
                JSONArray jsons;
                try {
                    jsons = new JSONArray(entity);
                    for (int i = 0; i < jsons.length(); i++) {
                        JSONObject jsonObj = jsons.getJSONObject(i);
                        //各要素をログに吐き出す
                        Log.d("kind", jsonObj.getString("kind")) ;
                        Log.d("etag", jsonObj.getString("etag")) ;
                        //itemsがコアな部分→JSONで再分解
                        JSONArray jsons2 ;
                        jsons2  = new JSONArray(jsonObj.getString("items"));
                        for (int j = 0; j < jsons2.length(); j++) {
                            JSONObject jsonObj2 = jsons2.getJSONObject(j);
                            Log.d("id", jsonObj2.getString("id")) ;
                            Log.d("title", jsonObj2.getString("title")) ;
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.d("ERR", "Connection Error ?");
            }
        }
        catch ( Exception e )
        {
            Log.d("ERR", "Error"+e.toString());
        }
    }
}
スポンサーサイト

トラックバック

コメント

コメントを残す

Secret



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。