androidの最近のブログ記事


twitter4j を使っている android アプリで、今まで動いていたのに以下のようなエラーが出るようになりました。

W/System.err(23240):     http://www.google.co.jp/search?q=bfb606ed or
W/System.err(23240):     http://www.google.co.jp/search?q=4ef9707c
W/System.err(23240): TwitterException{exceptionCode=[bfb606ed-4ef9707c], statusCode=403, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.3}
W/System.err(23240):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
W/System.err(23240):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
W/System.err(23240):     at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98)
W/System.err(23240):     at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:122)
W/System.err(23240):     at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104)
W/System.err(23240):     at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:281)
W/System.err(23240):     at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:273)

twitter4j の jar を最新版の 3.0.5 に差し替えたら動作するようになりました。

急に動かなくなるのは恐いです。。



twitter4j を使った認証で、ある日突然認証ができなくなった。

今までは動いていたのに以下のようなエラーで認証ができない。
特定の端末のみで起こっており、他の端末では問題なく動作する。

Received authentication challenge is null
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=bfb606ed or
http://www.google.co.jp/search?q=4ef9708b
TwitterException{exceptionCode=[bfb606ed-4ef9708b e2110e48-90349c9b], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.3}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:192)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98)
at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:122)
at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104)
at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:281)
at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:273)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.io.IOException: Received authentication challenge is null
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:1169)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:1111)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1064)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:735)
at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:156)
14 more

少々悩んだ結果、原因は端末の時刻が現在時刻と大きくずれていることでした。

端末の時刻を現在時刻に合わせたところ問題なく動きました。

テストのために時刻を進めていて、元に戻すのを忘れていました。。。

twitter4j に限らず iOS の twitter 認証でも同様に失敗するようです。

前にも一度これでハマったはずなのに、もう一度同じ失敗を繰り返しました。
しかも以前に経験していたことも思い出せなかったので備忘録として書きました。




Intent intent = new Intent("com.android.camera.action.CROP");
intent.setData(data.getData());
intent.putExtra("outputX", 320);
intent.putExtra("outputY", 320);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);

こんなコードで、クロップをまかせてみたが、帰ってきた画像の大きさが320x320になっていない端末がある。

Xperiaは320x320,Galaxyは160x160,Nexus7は229x229で返ってくる。

どうやらメモリ渡しなので大きさが制限されているようだ。

intent.putExtra("return-data", true);

intent.putExtra(MediaStore.EXTRA_OUTPUT, pickedFileUri);
に変えて、ファイルに書き出してもらうようにしたらちゃんと320x320で取得できました。




webView.loadData(htmlString, "text/html", "UTF-8") ;

とやると

画面上でWeb page not available というエラーが出てしまう。

Galaxy(4.1)では問題なく動くがXperia(2.3)では上記のエラーが出る。

webView.loadData(URLEncoder.encode(htmlString).replaceAll("\\+"," "), "text/html", "utf-8" ) ;

としたら解決。

先人の知恵はすばらしい。


Nexus 7 2013

| コメント(0) | トラックバック(0)

遅ればせながら2013年夏に発売された Nexus 7 を検証用に購入しました。
ちょっとケチって Wi-Fi 16GB モデルです。

まず最初の印象は物理的に軽いこと。
この大きさでも片手で楽に持てます。

肝心の動作も非常に滑らかに動きます。

OSは現在最新の2.3

画面も綺麗で解像度は 1920x1200 あるそうです。
私がPCで使っているディスプレイ(1920x1080)よりも高い解像度。。。

PCでメディア空き容量を確認したところ11GB台でした。
重いデータをガンガンに入れて使いたい人は32GBモデルにしたほうが良いかもしれません。

充電用アダプタとUSBケーブルは同梱されていました。


YouTube Android Player API を試そうと思い、サンプルをダウンロードして実行しようとしたところ

com.examples.youtubeapidemo/com.examples.youtubeapidemo.PlayerViewDemoActivity java.lang.ClassNotFoundException

となって停止してしまう。

いろいろと調べたところ以下の手順で解決できました。

Eclipseでプロジェクトを右クリックして [Properties] - [Java Build Path] - [Order and Export] で 「Android Private Libraries」にチェックを付けて OK ボタンクリック。

その後、[Project] - [Clean...] でクリーンにしてから、実行。

無事Activityが表示され動画の再生ができました。



In App Billing v3 の実装テストで、一度テスト購入したものをもう一度テストしたかったので、Google checkout の管理画面で該当トランザクションをキャンセルして、もう一度購入処理を実行してみた。

ところが、すでに購入済みの動きになってしまって、購入画面が出てこない。

checkout のキャンセル反映に時間がかかるのかと思い、しばらく待ってから試してみるが、同様に購入画面が出てこない。

調べてみたところ、In App Billing v3 は購入結果をキャッシュして、動作を高速化しているようだ。

推測だが、キャッシュに購入済みのフラグがあって、それを見て購入済みと判断されているらしい。

では、どうするか。

単純に考えるとキャッシュを削除すれば良さそうだ。

[設定] - [アプリケーション管理] - [Google Play ストア] - [キャッシュを消去]

でキャッシュを削除して、もう一度トライ。。。

無事に購入画面が表示されました。

意外とシンプルに解決。
はまらなくて良かった。。


In App Billing v3 でサンプルを参考に実装したが Can't start async operation (launchPurchaseFlow)となる。

一回目の処理はちゃんと走るのだが、そのまま二回目の処理に入ろうとするとこのエラーがでる。
メッセージの通り、前の launchPurchaseFlow が走っているので新しい launchPurchaseFlow は開始できないよ、ということなのだが対応はいかに。

05-22 06:54:05.451: E/AndroidRuntime(9179): FATAL EXCEPTION: main
05-22 06:54:05.451: E/AndroidRuntime(9179): java.lang.IllegalStateException: Can't start async operation (launchPurchaseFlow) because another async operation(launchPurchaseFlow) is in progress.
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.example.inappbilling.util.IabHelper.flagStartAsync(IabHelper.java:794)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.example.inappbilling.util.IabHelper.launchPurchaseFlow(IabHelper.java:358)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.example.inappbilling.util.IabHelper.launchPurchaseFlow(IabHelper.java:324)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at co.example.exampleapp.TutorialActivity.doPayment(ExampleActivity.java:641)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at co.example.exampleapp.TutorialActivity.onClick(ExampleActivity.java:625)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.view.View.performClick(View.java:2552)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.view.View$PerformClick.run(View.java:9229)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.os.Handler.handleCallback(Handler.java:587)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.os.Looper.loop(Looper.java:130)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at android.app.ActivityThread.main(ActivityThread.java:3701)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at java.lang.reflect.Method.invokeNative(Native Method)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at java.lang.reflect.Method.invoke(Method.java:507)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
05-22 06:54:05.451: E/AndroidRuntime(9179):     at dalvik.system.NativeStart.main(Native Method)

対応は onActivityResult を実装する。でした。
実装が抜けてました。
サンプルを参考にして onActivityResult を実装したら無事に動作しました。


webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(this, "activity");
view.loadUrl("javascript:window.activity.someMethod();") ;

というコードで activity の
public void someMethod() {
  ...
}
が呼ばれれいたのだが、android 4.2 から呼ばれなくなった。

調べたところ、4.2でセキュリティを考慮した仕様変更があったようです。

対応は、呼ばれるメソッドの宣言に
@JavascriptInterface
を記述するということのようです。

@JavascriptInterface
public void someMethod() {
  ...
}

な感じ。

JavascriptInterface cannot be resolved to a type
と言われたら

import android.webkit.JavascriptInterface;
を付けましょう。

targetSdkVersionも17以上になっているか確認しましょう。


startActivityForResult で起動したのに onActivityResult が呼ばれない。

なぜだろう。

悩んで調査した結果
呼び出し先のactivity に android:launchMode="singleTask" が指定してあったのが原因でした。

この記述を削除(デフォルト)にしたら無事 onActivityResult が呼ばれるようになりました。

singleTask だと使いまわされるから終了せずに onActivityResult が呼ばれないのだろうか。。


このアーカイブについて

このページには、過去に書かれたブログ記事のうちandroidカテゴリに属しているものが含まれています。

前のカテゴリはGALAXY S3です。

次のカテゴリはiOSです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.13-ja