私は PhoneGap を使用してきましたが、これは素晴らしいものでしたが、Verizon Droid w/ 2.0.1 で位置情報を取得する際に問題が発生しました (G1 w/ 1.6 では期待どおりに動作します)。
GeoLocation API サポートは 2.0 (Eclair) で Android に追加され、Verizon Droid (2.0.1) のデフォルト ブラウザーで動作します。つまり、navigator.geolocation.getCurrentPosition(success_callback, error_callback) を呼び出す Web サイトにアクセスすると、現在のドメインが「現在地を知りたい」というメッセージが表示され、「現在地を共有する」または「拒否する」オプションが表示されます。「場所を共有する」を選択すると、success_callback が最終的に場所データとともに呼び出されます。
WebView で同じ Web サイトにアクセスすると、navigator.geolocation.getCurrentPosition を呼び出しても JavaScript エラーは発生しませんが、[現在地を共有] ダイアログは表示されず、どちらのコールバックも呼び出されません。logcat で、関連するエラーと思われるものが表示されます。
WebView には必要な権限がないため、場所の更新の登録に失敗しているように思えます。これは、ユーザーに権限を求めるプロンプトを表示しなかった結果です。GeoPermissions に関連する Android 2.0 の Webkit パッケージにいくつかのメソッドとオブジェクトが追加されましたが、それらを使用して WebView に GeoPermission ダイアログを表示させることはできませんでした。
以下は、Android デベロッパー ガイドの Hello, WebView の例に基づいていますが、GeoPermissions に関連して 2.0 で追加された呼び出しとオブジェクトの一部が追加されています。*適切な URL で更新されました (著者の許可を得て - Oliver に感謝します!)。
誰もこれを機能させることができましたか? どんなフィードバックも素晴らしいでしょう、ありがとう!
package com.example.android.helloactivity;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.GeolocationPermissions.Callback;
public class HelloActivity extends Activity implements GeolocationPermissions.Callback{
WebView webview;
String geoWebsiteURL = "http://maxheapsize.com/static/html5geolocationdemo.html";
public HelloActivity() {
}
/**
* Called with the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_activity);
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setGeolocationEnabled(true); //seems like if i set this, the webview should prompt when I call navigator.geolocation.getCurrentPosition
GeolocationPermissions geoPerm = new GeolocationPermissions(); //added in API Level 5 but no methods exposed until API level 7
GeoClient geo = new GeoClient();
webview.setWebChromeClient(geo);
String origin = ""; //how to get origin in correct format?
geo.onGeolocationPermissionsShowPrompt(origin, this); //obviously not how this is meant to be used but expected usage not documented
webview.loadUrl(geoWebsiteURL);
}
public void invoke(String origin, boolean allow, boolean remember) {
}
final class GeoClient extends WebChromeClient {
@Override
public void onGeolocationPermissionsShowPrompt(String origin,
Callback callback) {
// TODO Auto-generated method stub
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
}
}