Evernote APIを使ったAndroidアプリを作る(1)

2012年4月7日土曜日

超長期間積みタスクのうちのひとつ、Evernoteを使ったお金メモアプリを作ろうというもの。

アイディアとしては「日々使ったお金をもとに家計簿を付けていくってのは続けていくのが結構しんどいけど、単純なルールでメモを取り続けること自体はそこまで大変じゃないのでは?」というところからスタートして「じゃあメモを書く先はEvernoteにして最低限の機能を用意し、携帯からでもPCからでも簡単に書ければいいよな」と辿り着いて自分の使ったお金のメモをEvernoteに取り始めたのが去年の4月4日。実にまる一年経ってる。
最初の読みは当たっててEvernoteにお金メモをつけていく事自体は今も続いてる。続けて一周年記念にそろそろAndroidから簡単にお金メモをいじれる(まずは投入出来る)アプリを作ろうという次第。


これ、そもそもEvernoteのAPIキーを取得したのは2010/09/19で実に1年半も何ら形にしてなかったとか泣けてくる。

まずは最低限の機能を持つメモ投入アプリを作る中でEvernote APIのクセに慣れていこうと思い作業開始。
パッケージ名はjp.muo.moneynoteにしつつ調べてみると名前被ってそうなのでアプリ名は後からもうちょい考えることにする。

使うのはEvernote Cloud API。
http://dev.evernote.com/documentation/cloud/ このへんから入手する。元々はWebサービスAPIとアプリAPIという区分がされていたのだけど、どうもそれらは統合されて 一方でプラットフォームへのライトな統合を行う(AndroidだとIntentベースでのEvernoteアプリ連携をする)Local APIというのも用意されてる。Cloud APIについて、執筆時点での最新版は1.21。

このSDK一式にはAndroid用のバインディングが含まれているので、クラスツリーを丸ごと新規作成したプロジェクトに投入。いきなりエラー出る。log4jが必要なので http://www.slf4j.org/index.html から入手し、今回の場合slf4j-log4j12-1.6.4.jarとslf4j-api-1.6.4.jarを参照に追加した。
thriftも足りないと言われるので http://thrift.apache.org/download/ ここから入手。ソースしか入ってないっぽいので thrift-0.8.0/lib/java ディレクトリにて
$ ant
でビルド。build/ 以下にビルド結果が出力されるけど、この中の lib/ ディレクトリにlog4jとか含まれてるな。こっち使ったほうがいいかも(今回は既にインポートしたものを使った)。

まだエラー出る。Android用ライブラリは参照設定したけどJava用のEvernoteバインディング自体を参照してないからっぽい。evernote-api-1.21内の java/lib/ 以下を見ると色々ある。そもそもlibthrift.jarとかlog4j-1.2.14.jarとかも含まれてる。依存関係的にここのライブラリ使うのがいいかも、と思いつつ先にインポートしたのをゴリ押ししたところ、案の定thrift周りで存在しないメソッドがあると怒られる。少々インポートするライブラリを整理。
  • evernote-api-1.21.jar
  • libthrift.jar
  • log4j-1.2.14.jar
  • slf4j-android-1.5.8.jar
のみでOK。
次に、ざっくりとサンプルを読む。evernote-api-1.21/android/sample/HelloEvernote/src/com/evernote/android/sample/HelloEvernote.java は、Cloud APIではなくLocal API(端末にインストール済みのEvernoteアプリをIntentで叩いて各種機能を実現するもの)の模様。これではなくEDAMベースでのデータ交換を行う evernote-api-1.21/android/sample/HelloEDAM/src/com/evernote/android/sample/HelloEDAM.java を読む。
sandbox環境に接続してメモ付きで画像をノートとして保存するための機能が一通り書かれてる。ログイン系は基本的にそのまま使うとして、今回実装したい機能は

  • ノートブックの一覧 を取得する
  • ノートブック一覧をユーザに対して表示し、うち1つを選択してもらう
  • 選択したノートブックのメモ一覧を取得し、コンテンツをローカルに取り込む
  • 任意のタイミングでノートブック内の一覧を更新出来るようにする
というもの。APIについて親切なチュートリアルなどは特に無いので、http://dev.evernote.com/documentation/reference/ のリファレンスを眺めてそれっぽいメソッドを探していく。
ノートの一覧は listNotebooks だろうな。ということでこんなコードを書いた。


    private void chooseNotebook() {
        try {
            final List<Notebook> notebooks = getNoteStore().listNotebooks(getAuthToken());
            String[] noteNames = new String[notebooks.size()];
            for (int i = 0; i < notebooks.size(); ++i) {
                Notebook notebook = notebooks.get(i);
                noteNames[i] = notebook.getName();
            }
            new AlertDialog.Builder(this).setTitle("ノートを選択してください").setItems(noteNames, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Notebook selectedNotebook = notebooks.get(which);
                    setTargetNotebook(selectedNotebook);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

で、実行したところここへくる前のログインでコケて詰んだ。APIキー発行してもらってからかなりの時間放置してたのでexpireしてるかも。ということでEvernote宛の問い合わせメールを書いて本日は終了。

0 件のコメント:

コメントを投稿