Android 2.0+의 WebView에서 Navigator.geolocation.getCurrentPosition 사용 (PhoneGap 관련)

StackOverflow https://stackoverflow.com/questions/2267513

문제

나는 폰 갭과 함께 일해 왔는데 훌륭했지만 2.0.1로 Verizon droid에서 위치를 얻는 데 문제가 생겼습니다 (G1 w/ 1.6에서 예상대로 작동).

지리적 위치 API 지원은 2.0 (ECLAIR)의 Android에 추가되었으며 Verizon Droid (2.0.1)의 기본 브라우저에서 작동합니다. 즉, navigator.geolocation.getCurrentPosition (success_callback, error_callback)을 호출하는 웹 사이트를 방문하면 장치는 현재 도메인이 "위치를 공유"또는 "거부"옵션이있는 대화 상자에서 "위치를 알고 싶다"고 프롬프트합니다. "위치 공유"를 선택하면 Success_Callback은 결국 위치 데이터로 호출됩니다.

WebView에서 동일한 웹 사이트를 방문하면 Call to Navigator.geolocation.getCurrentPosition에 JavaScript 오류가 발생하지 않지만 "위치 공유"대화 상자가 표시되지 않으며 콜백이 호출되지 않습니다. Logcat에서는 관련 오류가 무엇인지 알 수 있습니다. "02-15 10 : 37 : 00.413 : Error/GeolocationService (16871) : 시스템에서 위치 업데이트에 대한 등록에 걸린 보안 예외는 DumprenderTree에서만 발생해야합니다."

WebView가 필요한 권한이 없기 때문에 위치 업데이트에 등록하지 못하는 것 같습니다. 이는 사용자에게 권한을 부여하지 않은 결과입니다. GeoperMissions와 관련된 Android 2.0의 WebKit 패키지에 몇 가지 방법과 객체가 추가되었지만 WebView를 사용하여 GeoPermission 대화 상자를 표시 할 수 없었습니다.

다음은 Android Developer 's Guide의 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);
}

}

}
도움이 되었습니까?

해결책

방금 Android 2.1이있는 Nexus One에서 코드를 사용해 보았습니다. 당신은 당신의 매니페스트에 필요한 권한을 추가해야한다는 것을 기억하십시오.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

다른 팁

우리 (PhoneGap 팀)는 최근에이를위한 수정 사항을 발표했습니다. 기본적으로, 문제는 Android 2.0으로 인해 기본 WebView에는 이제 Navigator.geolocation의 자체 구현이 있으므로이 기능의 PhoneGap 브리지가 JavaScript에서 제대로 설정되지 않았다는 것입니다.

그 이후로 특정 커밋은 이에 대한 해결 방법을 만들었습니다. 우리는이 객체에 대한 우리 자신의 정의에 대한 기본 Navigator.geolocation 객체를 '프록시'합니다. 이 개체는 PhoneGap 프레임 워크와 잘 작동합니다.

이 수정은 다음 커밋을 참조하십시오. http://github.com/phonegap/phonegap-endroid/commit/5255F632377C36BEB0B4D2620940F33B6D02B2C7

이 링크에는 키가 있습니다http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html

Android -PhoneGap을 개발 중입니다

나는 추가했다

앱/res/xml/config.xml

<plugin name="Device" value="org.apache.cordova.Device" />

app/androidmanifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top