AndroidでつくるEvernote連携アプリ

第3回 Evernoteにノートを作る

この記事を読むのに必要な時間:およそ 4 分

ノートブックの選択

それではユーザの持つノートブック一覧をEvernoteのサーバから取得してみましょう。

Androidではhttp通信の処理についてはメインのUIスレッドを止めないように非同期で行うのが一般的ですが,Evernote SDKのサーバ間通信も非同期処理になっています。ノートを取得する処理は以下のように書くことができます。

mEvernoteSession.getClientFactory().createNoteStoreClient().listNotebooks(new OnClientCallback<List<Notebook>>() {
    @Override
    public void onSuccess(final List<Notebook> notebooks) {
        // 成功時の処理
     }

    @Override
    public void onException(Exception exception) {
        // 失敗時の処理
    }
}

セッションオブジェクトを基にノートストアのクライアントを作成し,listNotebooksメソッドでノートブックの一覧をサーバに取得しに行きます。成功時/失敗時ともに処理はコールバック関数の中で記述します。

今回のSimpleNoteFragmentではSelect a notebookのボタンを押下した際に上記のメソッを呼び出し,成功時→ダイアログを開いて取得できたノートブック一覧を取得とします。

成功時に開くダイアログの画面

成功時に開くダイアログの画面

これは,失敗時→エラーのToastを表示としています。

ユーザがいずれかのノートブックを選択して「OK」ボタンを押下した時点で,選択されたノートブックのguidを裏でセットしています。

ノートの作成

ノートブックの選択機能を作成したら,あとはノートそのものを選択したノートブックに保存する処理の作成です。

基本はノートブック一覧の取得時と同じで,違うのはあらかじめ保存するノートのオブジェクトを作っておくところだけです。ノートのオブジェクトを作成すると,オブジェクトに必要な情報をセットするための様々なメソッドが利用できます。

今回のサンプルでは,

  1. ノートのオブジェクトを作成し
  2. タイトルをセットし
  3. AndroidのEditText欄に入力されたテキストをcontentに格納し(ユーザの入力で改行"\n"があった場合,そこまでを1ブロックとしてdivタグで囲っています)
  4. ユーザがノートブックを選択していた場合は対応するノートブックのguidを格納し
  5. 最後にcontentの内容をノートの本文にセットする

という流れで実装しています。

Note note = new Note();  //(1)
note.setTitle(title);  //(2)

// (3)
if(content.contains("\n")) {
    String[] contents = content.split("\n");
                        content = "";
                        for(int i = 0; i < contents.length; i++) {
                            if(contents[i].equals("")){
                                contents[i] = "<br />";
                            }
                            contents[i] = "<div>" + contents[i] + "</div>";
                            content += contents[i];
                        }
                    }
                    content = EvernoteUtil.NOTE_PREFIX + content;

                    // (4)
                    if(guid != null) {
                        note.setNotebookGuid(guid);
                    }

                    // (5)
                    content = content + EvernoteUtil.NOTE_SUFFIX;
                    note.setContent(content);

作成するノートの準備ができれば,実際にノートを保存する処理はノートブック一覧の取得とそこまで変わりません。

mEvernoteSession.getClientFactory().createNoteStoreClient().createNote(note, new OnClientCallback<Note>() {
                            @Override
                            public void onSuccess(Note data) {
                                // 成功時の処理
                            }

                            @Override
                            public void onException(Exception exception) {
                                // 失敗時の処理
                            }
                        });

作成したノートのオブジェクトを引数に,非同期通信でEvernoteに対して保存処理を実施します。

実際にエミュレータでアプリを実行してみましょう。

エミュレータでアプリを実行

エミュレータでアプリを実行

"Select a notebook"で適当なノートブックを選んで,タイトルと本文を上記のように入力して"Save"を押下します。

成功したら,サンドボックスのサーバにブラウザからアクセスして,自身のアカウントでノートを確認してみましょう。

サンドボックスで試す

サンドボックスで試す

指定したノートブックに確かにノートが保存されているのがわかるはずです(ノートブックを指定しなかった場合は,デフォルトのノートブックに保存されます⁠⁠。

他にもENMLのタグを使ったテストをしてみましょう。

ENMLのタグを使ったテスト

ENMLのタグを使ったテスト

en-todoタグは,ノート内でチェックボックスを定義できる独自タグです。checked="true"をつけるとデフォルトでチェックが付いた状態になります。また下のspanタグは文字を赤く,サイズを大きく装飾していて,こちらは標準のcssと変わらない指定です。Evernoteのノート内では,すべてのスタイルはstyle属性を使ってインラインで行う必要があります。

このノートを保存すると実際に反映されていることが確認できます。

ノートの保存を確認

ノートの保存を確認

ここまでで,

  • ノートブックを選択して
  • タイトルと本文のみのノートを作成する

という実装が完了しました。

認証済みのセッションオブジェクトがあれば,用意された非同期通信のメソッドのみで簡単に処理が行えることがお分かりいただけるかと思います。

次回はノート作成についてもう少し踏み込んで,リソースについてお話します。

著者プロフィール

赤木法生(あかぎのりお)

日本の通信事業者所属でシステム開発に従事。大規模開発のSEを担当しつつ,個人でAndroidやスマホ向けAPIのサーバサイドプログラミングを行っています。メインはAndroidでPython,JavaScriptも触り中。現在はシリコンバレーのベンチャー企業にてトレーニー中。開発者向けのSDKと格闘しています。

https://github.com/redtree1112