2011年9月3日土曜日

[Android]WebViewでHTML5のgeolocationをつかう

Androidのセンサーを使ってもいいんですが、HTMLとWebViewとgoogleMapで地図表示みたいなことをしたときの話。
まぁ、↓を使ってみたんですが、これがうまくいかない。
navigator.geolocation.getCurrentPosition(showPosition, handleError);

で調べてみると、WebChromeClient#onGeolocationPermissionsShowPromptをオーバーライドしてコールバックで結果を返す必要があるということがわかりました。
でも、プロンプト出さずにcallback.invoke(origin, true, false);を呼べば、それらしく動作する。
これはコンテンツをつくるがわのモラルの話?になるんだろうか。コードはこんなかんじ。

webView.setWebChromeClient(new WebChromeClient(){
    public void onGeolocationPermissionsShowPrompt(final String origin, final Callback callback) {
        super.onGeolocationPermissionsShowPrompt(origin, callback);
        //プロンプトなして、Geolocationを有効にする
        SCAlertDialog.SCBuilder builder = new SCAlertDialog.SCBuilder(SharedInfo.getInstance().getContext());
        builder.setMessage("じおろける?");

        builder.setPositiveButton(
            R.string.OK,
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int whichButton){
                    //finish()はonPause()にいろいろと手を入れる必要があるので・・・
                    callback.invoke(origin, truefalse);
                }
            }
        );
        builder.setNegativeButton(R.string.Cancel, null);

        AlertDialog dialog = builder.create();
        Window window = dialog.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.token = SekaiApps.sharedApplication().getWindow().getAttributes().token;
        window.setAttributes(lp);

        // ダイアログを表示
        dialog.show();
    }

});

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);    // javascriptを有効にする