باستخدام navigator.geolocation.getCurrentPosition في WebView على Android 2.0+ (ذات صلة phonegap)

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

سؤال

لقد كنت أعمل مع PhoneGap وكانت رائعة ، لكنني واجهت مشكلة في الحصول على الموقع على Verizon Droid w/ 2.0.1 (يعمل كما هو متوقع على G1 W/ 1.6).

تمت إضافة دعم API GeoCOCCENT إلى Android في 2.0 (ECLAIR) ويعمل في المتصفح الافتراضي على Verizon Droid (في 2.0.1). هذا هو ، إذا قمت بزيارة موقع ويب يدعو navigator.geolocation.getCurrentPosition (Success_Callback ، Error_Callback) ، يطالب الجهاز بأن المجال الحالي "يريد معرفة موقعك" في مربع حوار مع خيارات "مشاركة الموقع" أو "التراجع". إذا قمت بتحديد "مشاركة الموقع" ، فسيتم استدعاء Success_Callback في النهاية مع بيانات الموقع.

إذا قمت بزيارة موقع الويب نفسه في عرض الويب ، فإن الاتصال إلى navigator.geolocation.getCurrentPosition لا يولد خطأً في JavaScript ، ولكن لم يتم عرض مربع حوار "مشاركة موقعك" ولا يتم استدعاء رد الاتصال على الإطلاق. في Logcat ، أرى ما يبدو أنه خطأ ذي صلة: "02-15 10: 37: 00.413: Error/GeoLocationService (16871): استثناء أمان تم صيده للتسجيل لتحديثات الموقع من النظام. يجب أن يحدث هذا فقط في DumprenderTree."

يبدو لي أن WebView فشل في التسجيل للحصول على تحديثات الموقع لأنه ليس لديه إذن مطلوب ، وهو ما بدوره نتيجة لعدم دفع المستخدم للحصول على الإذن. على الرغم من أن هناك العديد من الطرق والكائنات التي تمت إضافتها إلى حزمة WebKit في Android 2.0 المتعلقة بالعمليات الجيولوجية ، إلا أنني لم أتمكن من استخدام أي منها لتتسبب في عرض WebView لعرض مربع الحوار الجيولوجي.

يعتمد ما يلي على مثال Hello ، WebView من دليل مطور Android ، لكنه يضيف بعض المكالمات والكائنات التي تمت إضافتها في 2.0 المتعلقة بالعمليات الجغرافية. *تم تحديثه بعنوان URL المناسب (بإذن من المؤلف - شكرا أوليفر!).

هل تمكن أي شخص من الحصول على هذا العمل؟ أي ردود فعل سيكون رائعا ، شكرا!

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

}

}
هل كانت مفيدة؟

المحلول

لقد جربت الرمز الخاص بك على Nexus One مع Android 2.1 ، وهو يعمل بشكل جيد. تذكر أنك ستحتاج إلى إضافة الأذونات اللازمة إلى بيانك:

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

نصائح أخرى

لقد أصدرنا (فريق PhoneGap) مؤخرًا إصلاحًا لهذا الغرض. في الأساس ، كانت المشكلة هي أنه اعتبارًا من Android 2.0 ، أصبح لدى WebView الأصلي الآن تطبيقه الخاص بـ Navigator.goCocation ، وبالتالي لم يتم تعيين جسر PhoneGap لهذه الوظيفة بشكل صحيح في JavaScript.

منذ ذلك الحين ، أنشأ التزام معين حلًا عن ذلك: نحن "وكيل" Native Navigator.GoOlcocation كائن إلى تعريفنا الخاص لهذا الكائن. يعمل هذا الكائن بشكل جيد مع إطار عمل PhoneGap.

لهذا الإصلاح ، راجع الالتزام التالي: http://github.com/phonegap/phonegap-android/commit/5255f632377c36bb0b4d2620940f33b6d02b2c7

هذا الرابط لديه المفتاحhttp://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html

أنا أتطور مع Android - PhoneGap

أضفت

التطبيق/الدقة/xml/config.xml

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

التطبيق/Androidmanifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top