Android、Java、Web系、Linux、マラソン等の備忘録

2013/02/17

Evernote SDK for Androidを新しいバージョン1.0.2へ移行に伴い

0 件のコメント
昨年2012年の10月くらいのバージョンが、
  • Evernote SDK for Android version 0.2.3
  • Evernote API version 1.22
で、アプリの開発を進めてきたわけですが、既知の問題があり、
Known Issues
------------
The current version of the SDK performs OAuth network requests on the main thread, resulting in a NetworkOnMainThreadException when the targetSDK is set to 11 or higher.
 Android 2.3.3以下あたりでログインできませんでした。確かコミュニティで自分で直せ的に書かれて気がしますし、ソースを見たら大した問題じゃなかった気がしますし、確認に使ってるエミュレータは4.0.3なので、Evernote SDKがそのうちバージョンアップされるか、されなかったらそのうち自分で修正してやろうと思ってました。そろそろアプリをテストするしどうなったかGithubを見たら、新しいのがリリースされてました。
・evernote/evernote-sdk-android · GitHub
https://github.com/evernote/evernote-sdk-android
  • Evernote SDK for Android version 1.0.2
  • Evernote API version 1.23
「Known Issues」の表記も消えているので、修正されたのでしょう(まだ確認してません)
今まで当たり前のようにEvernoteのsandboxを使ってデバッグしてましたが...
あれ...どうやって導入したっけと忘れており、ハマってしまいました。というか、このgithubのReadMeに従ってやっておらず、旧式のjarファイルを突っ込む形でやってたので、一筋縄にいきませんでした。

同じことを繰り返さないよう、まあReadMeに書いてあるんですけど、メモしておきます。

  1. Githubから一式ダウンロード
  2. Eclipse上で新規プロジェクトの作成で、既存のコードを使ってプロジェクト生成
  3. Libraryディレクトリを指定して終了 ※1
  4. Evernote SDKを使うAndroidプロジェクト上で右クリック > プロパティ
  5. 表示されたプロパティのAndroidを選択
  6. [ライブラリ]の追加ボタンで、2~3で生成したプロジェクトを指定
  7. あとは、プロジェクトをクリーンしてビルドみたいなことを ※2
※1 ActionBarSherlockを入れてる場合は、プロジェクト名がかぶるので、適当にディレクトリ名をリネームして導入すればおk

※2 ビルドがうまくいってないとエラーが出たりします。503エラーとか出てファッ!?ってなりました。

バグフィックス程度のバージョンアップだったら良かったですが....
微妙に認証まわりが変更されてて地味にコードの修正が必要となりました。まぁでも、上記バグフィックスと、認証のブラウザが勝手にアプリ埋め込みで起動してくれるので、やる価値はあると思います。以前のバージョンでは、端末の標準ブラウザを勝手に起動して(アプリ外で認証し)、認証が終わったブラウザはそのまま放置みたいな仕様でしたから。アプリ内に勝手に埋め込みブラウザを立ち上げて、認証後は消してくれるので動作が実にスマートです。

以下、サンプルソースを基に変更点を。基本的には、
  1. 認証開始
  2. (アプリ内に勝手に起動する)ブラウザで認証してもらう
  3. 戻りはonResume
という流れは変らないですが、認証開始時等でSDKからonActivityResultに入ってくるようになりました。

switch (requestCode) {
  //Update UI when oauth activity returns result
  case EvernoteSession.REQUEST_CODE_OAUTH:
    if (resultCode == Activity.RESULT_OK) {
      updateUi();
    }
    break;
}

のようにrequestCodeを捌いてやる必要がありますが、認証の戻りはonResumeのようです..
また、セッションの生成はgetPreferencesの設定を基に行われてましたが、Activity等のContextに変更され、new EvernoteSessionしていた箇所を

mEvernoteSession = EvernoteSession.init(this, CONSUMER_KEY, CONSUMER_SECRET, EVERNOTE_HOST, null);

のようにstaticメソッドで初期化するようになったみたいです。ちなみに、EVERNOTE_HOSTは

private static final String EVERNOTE_HOST = EvernoteSession.HOST_SANDBOX;

のように固定の定義値を使えるようになりました。

[ログイン]
mEvernoteSession.authenticate(this);
[ログアウト]
mEvernoteSession.logOut(getApplicationContext());

以前のバージョンのサンプルで、setupSession()内に、
    ApplicationInfo info =
      new ApplicationInfo(CONSUMER_KEY, CONSUMER_SECRET, EVERNOTE_HOST,
          APP_NAME, APP_VERSION);

onResume内の
    // Complete the Evernote authentication process if necessary
    if (!session.completeAuthentication(getPreferencesForAuthData())) {
      // We only want to do this when we're resuming after authentication...
      Toast.makeText(this, "Evernote login failed", Toast.LENGTH_LONG).show();
    }
は丸ごと必要ないみたいです。

こんな感じでしょうか。あと、サンプルではノートや画像の処理でAsyncTaskを使うように修正されてましたが、詳しくは見てません。

今回の移行が面倒だったのは旧式のJarファイルをlibsディレクトリに入れてやってたのが問題で、

import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;

import com.evernote.thrift.TException;
import com.evernote.thrift.transport.TTransportException;


のような変更やTTransportExceptionの追加が必要だったためでした。

0 件のコメント :

コメントを投稿