素人のアンドロイドアプリ開発日記

web連携のコンテンツ

sslにおけるエラーの問題

2015.02.11

wv.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
handler.proceed();
super.onReceivedSslError(view, handler, error);
}
});
しにそうなほど、悩んだエラーについて、
証明書がおかしいと落ちる。

エラーが出るってよりも、アプリが落ちる

いろんな人が紹介してるんだけど、
見事に落ちる。

その結果
原因が
super.onReceivedSslError(view, handler, error);
だった。

ついうっかりオーバーライドでそのままにしておいてしまうけど、
onReceivedSslErrorはデフォルトでhandler.cancel();

をしているので、
つまりは、

proceedした直後にcancelしててエンストみたいな事になっていた。
気づくのに16時間くらいかかったわ。

super.onReceivedSslError(view, handler, error);
を消したら、エラーもなくなりました。

カテゴリー:web連携

webviewにとりあえずblankを突っ込む方法

2013.05.12

webviewを使っていると切り替えの時にいつまでも前のページが残ったりしてしまうのだけど、

それを防止する為に、空のページを表示させてから次のページに移動すると、わりと綺麗に見える時がある。

WebView _wv = (WebView)findViewById(R.id.webView1);
String BLANK = "<html><head><title>NextPass</title></head><body></body></html>";
_wv.loadDataWithBaseURL("file:///android_asset/", BLANK, "text/html", "utf-8", null);

空の値が入ります。

カテゴリー:web連携

WebChromeClientで使える関数のまとめ

2011.12.02

前回WebViewClientの関数をまとめましたが、今回はWebChromeClientをまとめました。

WebViewClientに関しては、主に通信の関数が多かったのですが、WebChromeClientは、主に、JavaScriptとの連携などが多いです。

 

■getDefaultVideoPoster()
When not playing, video elements are represented by a ‘poster’ image.

上記は、videoタグの対応をする為にposter属性と言うのが存在します。
poster:映像データが利用不可能な場合に表示される画像データを URI 形式で指定します。

cf:https://developer.mozilla.org/Ja/HTML/Element/Video

と言う事なので、設定されている場合もあるようですが、存在しない場合には、こちらでデフォルトのものを表示できます。
その為のデータです。

cf:android-group-japan

 

■getVideoLoadingProgressView()
When the user starts to playback a video element, it may take time for enough data to be buffered before the first frames can be rendered.

これは値としてviewを返すのだが、Viewを返すのみで、ここで進捗に対しての対応をする事はできない。

cf:android-group-japan

 

■getVisitedHistory(ValueCallback<String[]> callback)
Obtains a list of all visited history items, used for link coloring

ユーザーがクロールした、データを一通り取得ができる。
不確かですが、更新されるタイミングで発行できるような。

 

■onCloseWindow(WebView window)
Notify the host application to close the given WebView and remove it from the view system if necessary.

window.close()が実行された場合などに、実行される関数。基本的には、window.openなどで作成したエリアに関して実行をする。

 

■onConsoleMessage(String message, int lineNumber, String sourceID)
This method is deprecated. Use onConsoleMessage(ConsoleMessage) instead.
■onConsoleMessage(ConsoleMessage consoleMessage)
Report a JavaScript console message to the host application.

コンソールの表示をしてくれるらしいので、実機でのみバグが発生する時に使用かな?と思います。

尚、APIレベル7で提供されている onConsoleMessage(String, int, String) は、APIレベル8ではonConsoleMessage(ConsoleMessage) となり、非推奨となりました。
cf:http://d.hatena.ne.jp/lionas/20110104/1294067233

 

■onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg)
Request the host application to create a new Webview.

新しいウインドウを開こうとした場合に利用をします。
開く予定のデータなどを用いて、表示を行う事ができるので、次のように別のwebViewを作るなどの対応が可能です。

google codesearch
ですが、渡す先の新しいwebViewをどのように設定をするかを決めます。

@Override
public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture,Message resultMsg) {
 WebView childView = new WebView(getActivity());
 final WebSettings settings = childView.getSettings();
 settings.setJavaScriptEnabled(true);
 childView.setWebChromeClient(this);
 WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
 transport.setWebView(childView);
 resultMsg.sendToTarget();
 mHadOnCreateWindow = true;
 return true;
}

transportやと、sendToTargetなどを行う必要があります。結構面倒ですが、
[新しいwebViewを作成]→[transportを設定]→[sendToTargetを設定]

 

■onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
Tell the client that the database quota for the origin has been exceeded.

下記のようにweb storageを利用する場合に設定をする。
Android WebView で HTML5 の Web Storage と Web SQL Database API を使う
http://d.hatena.ne.jp/nobnak/?of=9

 

■onGeolocationPermissionsHidePrompt()
Instructs the client to hide the Geolocation permissions prompt.

GeoLocationのパーミッションが取得できない場合に実行される。
cf:http://www.saturn.dti.ne.jp/~npaka/android/webkit/index.html

 

■onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)
Instructs the client to show a prompt to ask the user to set the Geolocation permission state for the specified origin.

GeoLocationのパーミッションが取得できた場合に実行をする。
cf:http://www.saturn.dti.ne.jp/~npaka/android/webkit/index.html

 

■onHideCustomView()
Notify the host application that the current page would like to hide its custom view.

<<<使い方不明>>>
カスタムビューのつくり方がわからない。

 

■onJsAlert(WebView view, String url, String message, JsResult result)
Tell the client to display a javascript alert dialog.

javascriptのalertが呼ばれた時に実行される。
基本的には、Toastなどで代用をする。
※以前、このブログでも紹介していました。

@Override  
public boolean onJsAlert(final WebView view , final String url, final String message,JsResult result){  
 Toast.makeText(WebJs.this, message, Toast.LENGTH_SHORT).show();  
 result.confirm();  
 return true;  
}

または、下記のようにOKをおさせる仕組みでもよいのかもしれない。

public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
 new AlertDialog.Builder(context)
 .setTitle(R.string.title_dialog_alert)
 .setMessage(message)
 .setPositiveButton(android.R.string.ok,
 new AlertDialog.OnClickListener() {
 public void onClick(DialogInterface dialog, int which) {
 result.confirm();
 }
 })
 .setCancelable(false)
 .create()
 .show();
 return true;
};

cf:Mosembro.java

 ※以前は設定しないと表示されなかったはずですが、現在では実装しなくてもalertDialogを表示してくれます。

■onJsBeforeUnload(WebView view, String url, String message, JsResult result)
Tell the client to display a dialog to confirm navigation away from the current page.

<<<確認中>>>
使いようがわからない。

 

■onJsConfirm(WebView view, String url, String message, JsResult result)
Tell the client to display a confirm dialog to the user.

@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
 result.confirm();
 result.cancel();
 return true;
}

上記の形で、confirmかcancelのどちらを利用するかが重要になります。
中国語ですが。。下記が参考になりました。
cf:http://android.yaohuiji.com/archives/tag/onjsconfirm

  ※以前は設定しないと表示されなかったはずですが、現在では実装しなくてもalertDialogを表示してくれます。

■onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
Tell the client to display a prompt dialog to the user.

@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
 result.confirm(value);
 result.cancel();
 return true;
};

上記の形ですが、onJsPromptで、上記のようにconfirmとcancelを分けて分岐をしますが、
onJsConfirmと異なり、valueの設定をする必要があります。

Mosembro.java

  ※以前は設定しないと表示されなかったはずですが、現在では実装しなくてもalertDialogを表示してくれます。

■onJsTimeout()
Tell the client that a JavaScript execution timeout has occured.

JSのタイムアウトの際に実行されるらしい。
どういう場合にこの状況になるのかは不明

 

■onProgressChanged(WebView view, int newProgress)
Tell the host application the current progress of loading a page.

シークバーと同じ仕組みで問題ないかと思う。

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
 Log.v("onProgressChanged()",
 String.valueOf(progress) + ", " + String.valueOf(fromTouch));
}

http://www.adakoda.com/android/000128.html

ただ、ここで送られる進捗に関しては
WebChromeClient サブクラスはブラウザのUIに影響を与える可能性のある処理が起こったときに呼ばれる。例えば、アップデートの進捗や JavaScript の alerts はここに送られる。
http://y-anz-m.blogspot.com/2010/07/androidwebview.html
なのだが、ちょっと不明である。アップデータの進捗と言う事はajaxの対応かとも思うのだが。

 

■onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
Tell the client that the Application Cache has exceeded its max size.

<<<確認中>>>

 

■onReceivedIcon(WebView view, Bitmap icon)
Notify the host application of a new favicon for the current page.

<<<確認中>>>
iconがビットマップで飛んでくるっぽい

 

■onReceivedTitle(WebView view, String title)
Notify the host application of a change in the document title.

ページのタイトルを取得できるのだが、通常利用する時には、
下記のような形でもよいのかもしれない。
webview.getTitle()
上記は更新のタイミングで読み込まれるのかと思うので、
ページ遷移を繰り返す場合には、この方法で実装してあげると、
リアルタイムでページのタイトルを取得できる。

 

■onReceivedTouchIconUrl(WebView view, String url, boolean precomposed)
Notify the host application of the url for an apple-touch-icon.

<<<確認中>>>
タッチアイコンってどこに表示するものだろうか。。

 

■onRequestFocus(WebView view)
Request display and focus for this WebView.

webView.requestFocus();
上記のように設定をするとブラウザにフォーカスが当たります。
フォーカスを当てる理由としては、キーボードが出ないとか、ボタンが押せない時に利用をしたいですが。。

 

■onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback)
Notify the host application that the current page would like to show a custom View in a particular orientation.
■onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
Notify the host application that the current page would like to show a custom View.

下記のサンプルで利用をしているのだが、イマイチ使い方がわからない。。
google grope

 

以上です、。まだ、仕様を使いきっている人がそこまでいないのですが、だれか標準化webClientとか、コピペで使えるのを作ってくれたら嬉しいのにな。

カテゴリー:web連携

WebViewClientで使える関数のまとめ

2011.12.02

最近webviewを利用しているのですが、思うように実装をされてないものが多く、割と苦労をしてしまいます。その中でもwebClientの中にはいくつかの関数を上書きして利用すると便利なのですが、まとめて載せてあるサイトがなかったので、カンタンな説明と、参考になるサイトがあるおのに関しては参照させていただいております。

 

使える関数というのは、次のような使い方です。

-.setWebViewClient(new WebViewClient(){
function この関数(){

}
});

 

■public void onLoadResource (WebView view, String url)

//サイトを読み込む時にそのリソースを検証する。
※外部サイトの際、Intentなどで、標準のブラウザに飛ばすなどで利用できる。

cf:世田谷のエンジニア ブログ

 

■public void onPageFinished (WebView view, String url)

//ページの読み込みの終了※使いやすい!!

 

■public void onPageStarted (WebView view, String url, Bitmap favicon)

//ページの読み込みのスタート※使いやすい

 

■public void onReceivedError (WebView view, int errorCode, String description, String failingUrl)

//ページの読み込み失敗

 

■public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm)

//ベーシック認証などサーバーへの設定を行える。

cf:ダメ男のブログ

 

■public void onReceivedLoginRequest (WebView view, String realm, String account, String args)

//Notify the host application that a request to automatically log in the user has been processed.
公式の文ですが、セッションが効く状態でページに遷移をした場合にトップから勝手にマイページへ飛ぶなどの処理かと思います。

 

■public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)

SSLページのエラー処理を行う部分。エラーでも進むなどの対応ができるらしい
android2.2より対応

cf:My Happiness

 

■public void onScaleChanged (WebView view, float oldScale, float newScale)

//これはそのまま、スケールの変更だと思う。

 

■public void onTooManyRedirects (WebView view, Message cancelMsg, Message continueMsg)

//This method is deprecated. This method is no longer called. When the WebView encounters a redirect loop, it will cancel the load
無限ループに遭遇した場合の対処。との事です。ですが、このメソッドは既に廃止されていますとの事なので、使わない方が無難。

 

■public void onUnhandledKeyEvent (WebView view, KeyEvent event)

//Notify the host application that a key was not handled by the WebView.
(不確か)おそらくキーボードイベントなど取得できないサイトで、キーをたたく場合。
(逆にブラウザ独自のショートカットキーを入れる時などに利用するのでは?と思います。)

 

■public WebResourceResponse shouldInterceptRequest (WebView view, String url)

//読み込み直前に呼ばれる。

 

■public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event)

//各種キーイベントを呼び出すのに利用ができるようです。
onUnhandledKeyEventでは、handle出来ないキーイベントの取得でしたが、こちらは
上書きなので、割と使いやすかもしれません。

 

■public boolean shouldOverrideUrlLoading (WebView view, String url)

//各読み込み
※個人的に利用をしていたときに、super.shouldOverrideUrlLoading(view,url)を読み込んでいなかった為、
他で設定したファンクションが動かないというバグが発生してしまいました。ここでは、値にmailtoが入っていた場合には、Intentでメーラーを動作させるなどができます。

cf:MARTINI R&D

※上記サイトのメール送信用プログラムは大変勉強になりますが、return super.shouldOverrideUrlLoading(view,url);などをしてあげないと、他の関数を利用する際にバグが出てしまいました。webChromeViewの方で_blankを開く設定をしてた場合に開かなくなりました。

一応、googleさんの参照

http://developer.android.com/reference/android/webkit/WebViewClient.html

 

割と難しいですが、使えると楽です。以上です。

カテゴリー:web連携

WebViewでTwitterが見れない&横に変な隙間が。

2011.11.17

アプリ内にWebViewを埋め込む際に、Twitterのページをスマホでアクセスをすると、ローディング画面がはじまりますが待てど暮らせど、ローディングが終わりません。

結局、内部にセッションを保ちたい場合には、その要素がwebclientに実装がされてない場合には自分で実装をしなくてはいけないようです。

 

【失敗談1】

キャッシュをオンする

webView.getSettings().setCacheMode(true)

上記で、キャッシュをオンしたのですが、やはり通じなかったです。

 

【失敗談2】

クッキーをオンする。(参照:AndroidのWebViewにて、mixiにログインするためのソース:urapicoのメモ帳

webView.setWebViewClient(new WebViewClient(){
 
 String loginCookie = "";    
 @Override
 public void onLoadResource(WebView wv, 
 String url){
 CookieManager cMgr = CookieManager.getInstance();
 loginCookie = cMgr.getCookie(url);
 }
 @Override
 public void onPageFinished(WebView wv, 
 String url){
 CookieManager cMgr = CookieManager.getInstance();
 cMgr.setCookie(url, loginCookie);
 }
 });

このmixiでできるなら、出来るだろうとタカをくくっていたのでショックでした。。

 

上記の2度の失敗で割りとあきらめかけたのですが、

Android1.6以降対応アプリのwebViewでTwitterがずーと表示されない現象への対処|アンドロイドノート(Android Note)

 

対処方法

webView.getSettings().setDomStorageEnabled(true);

とこの問題に直面している人が少なかったのは、きっとwebViewでtwitterにいくなんて事はしないで、twitterクライアントを選ばせて実行する方がandroidでポピュラーなのかなぁと思いました。

上記の感じで。

ツイッターが確認できました。

 

また、ついでになるのですが、デフォルトで、アンドロイドのスクロールバーの背景が白くなるので、右端に変な隙間みたいのができる時があります。そういう場合は

webView.setVerticalScrollbarOverlay(true);

で対応が可能です。

カテゴリー:web連携

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする