2014-09-25

Android4.4のWebViewでshouldOverrideUrlLoadingが呼ばれない

Android4.4(KitKat)から、WebViewでChromeが使われるようになった。これとともに、shouldOverrideUrlLoadingが呼ばれないという問題が起きていた。

原因の1つは、aタグのhref属性に、不正な形式のURIが指定されているというもの。<a href='share-content'> というようになっているとshouldOverrideUrlLoadingが呼ばれない。これはたとえば、<a href='intent:share-content'> というようにしなくてはいけない。

もう1つの原因は、webview.getSettings().setSupportMultipleWindows(true) と指定しており、リンクが target='_blank' となっているもの。target='_blank' をやめるか、webview.getSettings().setSupportMultipleWindows(false) にしなくてはいけない。なお、これはデフォルトでfalseなので明示的に指定しなければ問題ない。

nendの広告を、WebView内に表示していたのだが、これが反応しなくなっていて困った。

2014-09-24

AndroidでBitmapをWebViewに表示する

Data URIスキーマを使えば、AndroidのWebViewにBitmapを表示することができる。つまり、imgタグのsrcに、「http://」で始まる画像の場所を書くのではなくて、「data:image/png;base64,」のようにして始まる画像のデータを埋め込む。

たとえば、Bitmap iconがあったとして、
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    icon.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    String imgageBase64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
    String imageSrc = "data:image/png;base64," + imgageBase64;
    String htmlTag = "<img src='"  + imageSrc +  "'/>";
みたいにやる。
Base64にエンコードするときは、Base64.NO_WRAPをしてやらないとダメ。

can't find referenced class android.view.accessibility.CaptioningManagerを直す

Androidのproguard関連のエラー。AdMobを更新したらエラーで失敗するようになった。「com.google.android.gms.cast.TextTrackStyle: can't find referenced class android.view.accessibility.CaptioningManager」と言われる。

「You may need to specify additional library jars (using '-libraryjars').」と出力されていたが、この方法では直らなかった。

プロジェクトのビルドターゲットを、Android4.4.2にしたら直った。AndroidManifest.xmlのandroid:targetSdkVersionのことではなくて、eclipseのプロパティで設定するやつ。