13

私は 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);
}

}

}
4

3 に答える 3

23

Android 2.1 を搭載した Nexus One でコードを試してみましたが、問題なく動作します。マニフェストに必要なアクセス許可を追加する必要があることに注意してください。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
于 2010-03-31T19:35:58.833 に答える
4

私たち (PhoneGap チーム) は最近、この問題の修正をリリースしました。基本的に、問題は Android 2.0 の時点で、ネイティブ WebView が navigator.geolocation の独自の実装を持っているため、この関数の PhoneGap ブリッジが JavaScript で適切に設定されていないことでした。

それ以来、特定のコミットにより、これに対する回避策が作成されました。ネイティブの navigator.geolocation オブジェクトを、このオブジェクトの独自の定義に「プロキシ」します。このオブジェクトは、PhoneGap フレームワークでうまく機能します。

この修正については、次のコミットを参照してください: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

于 2010-02-18T23:58:23.940 に答える