昨年2012年の10月くらいのバージョンが、
- Evernote SDK for Android version 0.2.3
- Evernote API version 1.22
で、アプリの開発を進めてきたわけですが、既知の問題があり、
Known IssuesAndroid 2.3.3以下あたりでログインできませんでした。確かコミュニティで自分で直せ的に書かれて気がしますし、ソースを見たら大した問題じゃなかった気がしますし、確認に使ってるエミュレータは4.0.3なので、Evernote SDKがそのうちバージョンアップされるか、されなかったらそのうち自分で修正してやろうと思ってました。そろそろアプリをテストするしどうなったかGithubを見たら、新しいのがリリースされてました。
------------
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.
・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ファイルを突っ込む形でやってたので、一筋縄にいきませんでした。
あれ...どうやって導入したっけと忘れており、ハマってしまいました。というか、このgithubのReadMeに従ってやっておらず、旧式のjarファイルを突っ込む形でやってたので、一筋縄にいきませんでした。
- Githubから一式ダウンロード
- Eclipse上で新規プロジェクトの作成で、既存のコードを使ってプロジェクト生成
- Libraryディレクトリを指定して終了 ※1
- Evernote SDKを使うAndroidプロジェクト上で右クリック > プロパティ
- 表示されたプロパティのAndroidを選択
- [ライブラリ]の追加ボタンで、2~3で生成したプロジェクトを指定
- あとは、プロジェクトをクリーンしてビルドみたいなことを ※2
※1 ActionBarSherlockを入れてる場合は、プロジェクト名がかぶるので、適当にディレクトリ名をリネームして導入すればおk
※2 ビルドがうまくいってないとエラーが出たりします。503エラーとか出てファッ!?ってなりました。
バグフィックス程度のバージョンアップだったら良かったですが....
微妙に認証まわりが変更されてて地味にコードの修正が必要となりました。まぁでも、上記バグフィックスと、認証のブラウザが勝手にアプリ埋め込みで起動してくれるので、やる価値はあると思います。以前のバージョンでは、端末の標準ブラウザを勝手に起動して(アプリ外で認証し)、認証が終わったブラウザはそのまま放置みたいな仕様でしたから。アプリ内に勝手に埋め込みブラウザを立ち上げて、認証後は消してくれるので動作が実にスマートです。
以下、サンプルソースを基に変更点を。基本的には、
- 認証開始
- (アプリ内に勝手に起動する)ブラウザで認証してもらう
- 戻りは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していた箇所を
また、セッションの生成は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()内に、
onResume内の
こんな感じでしょうか。あと、サンプルではノートや画像の処理で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;
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の追加が必要だったためでした。
コメント
コメントを投稿