今回は第6回で実行したサンプルコードの解説をします。Androidアプリケーションは、アクティビティという単位で動作します。通常は各アクティビティが各画面に相当します。アクティビティが生成されるとonCreateメソッドが呼ばれますので、画面の初期化処理などはonCreateメソッドをオーバーライドして行います。HelloEDAM.javaの113-122行目がonCreateメソッドの実装になります。
114行目でスーパークラスのonCreateメソッドを呼んだ後に、サンプルコード固有の初期化をしています。115行目のsetContentViewが画面の初期化部分で、引数のR.layout.mainが特定の画面を指すIDになっています。
左のPackage ExplorerからHelloEDAM/res/layout/main.xmlを選択してください。このファイルがR.layout.mainに相当します。Graphical Layoutでボタンなどのコンポーネントを配置することで、簡単に画面を作成することができます。
Graphical Layoutで作成した画面は、実際にはXMLで定義されています。下側にあるmain.xmlタブをクリックすると、xmlの中身を確認することができます。もちろん直接xmlを編集することもできます。
各要素には、android:id="@+id/save_button"のようにandroid:id属性が振られています。この属性値が、アプリケーション側ではR.id.save_buttonというIDとして解釈されるようになっています。たとえば、onCreateメソッド内の(Button)findViewById(R.id.save_button);では、R.id.save_buttonを指定することで、ボタンのインスタンスを取り出しています。
初期化の最後に呼ばれるsetupApiメソッドを見てみましょう。ここではEvernote APIの初期設定をしますが、基本的な処理は第4回で解説した通りですので、そちらを参照してください。通常、通信の初期化の中ではTHttpClientクラスを使用しますが、Evernote APIにはそれをAndroid用に最適化したTAndroidHttpClientが用意されているので、このコードはそれを利用しています。UserStoreやNoteStoreは、以下のようにTAndroidHttpClientを通して作成します。
次は、ギャラリーから画像を選択する部分です。main.xmlに戻って、13-17行目を見てください。これが“Select Image...”ボタンの定義になります。android:onClick属性で、ボタンがクリックされたときに呼び出されるメソッドを指定します。ここではstartSelectImageメソッドになります。
startSelectImageメソッドはHelloEDAM.javaの129-133行目にあります。AndroidではIntentという機能を通して別のアクティビティを起動することで、アクティビティ間の連携を行えます。ここでは画像選択の機能をIntentで呼び出しています。
呼び出したアクティビティから制御が戻ると、onActivityResultメソッドが呼ばれます。ここでstartSelectImageから戻ってきた場合かどうかを判断して、endSelectImageメソッドを呼び出しています。
endSelectImageメソッドでは、画像選択で指定した画像データを取り出しています。
選択した画像をEvernoteに保存するには、“Save Image”ボタンを押します。“Save Image”ボタンのonClickに設定されているのはsaveImageメソッドですので、saveImageメソッドの中身を見ましょう。重要なのは191行目です。画像ファイルをEvernoteのFileDataとするときに、ファイルのmd5ハッシュ値を算出しています。このハッシュ値は後でen-mediaから参照するときに使います。Evernoteにメディアデータを保存するときには、この作業が必須になります。
Resourceを作成して、先ほどのFileDataとMIMEタイプとセットで登録します。
次にノートを作成して、ノートにタイトルとResourceを加えます。
ノートの内容はENMLで記述する必要があります。ENML内で画像を置きたい場所に、en-media要素を追加します。en-mediaの属性として、先ほど作成したリソースと同じMIMEタイプとハッシュ値を設定します。もしリソースに対応するen-media要素がENML内に存在しないと、画像がノートに載りませんので注意してください。
最後にNoteStoreのcreateNoteメソッドを呼び出せば、Evernoteのサーバにノートが保存されます。
Androidサンプルコードの解説は以上です。次回はこのコードをベースに、機能追加をしてみたいと思います。