Подтвердить что ты не робот

Phonegap/Cordova geolocation не работает на Android

У меня возникли проблемы с тем, чтобы Geolocation работала на Android в обоих эмуляторах (даже когда я geo fix через telnet) и на устройстве. Работает на iOS, WP8 и в браузере.

Когда я спрашиваю устройство о местоположении с помощью следующего кода, я всегда получаю сообщение об ошибке (в моем случае пользовательский Retrieving your position failed for unknown reason. с null код ошибки и сообщение об ошибке).

Связанный код:

    successHandler = (position) ->
      resolve App.Location.create
        lat: position.coords.latitude
        lng: position.coords.longitude

    errorHandler = (error) ->
      error = switch error.code
        when 1
          App.LocationError.create
            message: 'You haven\'t shared your location.'
        when 2
          App.LocationError.create
            message: 'Couldn\'t detect your current location.'
        when 3
          App.LocationError.create
            message: 'Retrieving your position timeouted.'
        else
          App.LocationError.create
            message: 'Retrieving your position failed for unknown reason. Error code: ' + error.code + '. Error message: ' + error.message

      reject(error)

    options =
      maximumAge: Infinity # I also tried with 0
      timeout: 60000
      enableHighAccuracy: true
    navigator.geolocation.getCurrentPosition(successHandler, errorHandler, options)

платформы/Android/AndroidManifest.xml

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

www/config.xml(на всякий случай)

<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.GeoBroker" />
</feature>

Использование Кордовы 3.1.0. Тестирование на Android 4.2. Плагин установлен. Cordova.js, включенные в index.html(другие плагины, такие как InAppBrowser, работают нормально).

$ cordova plugins ls
[ 'org.apache.cordova.console',
'org.apache.cordova.device',
'org.apache.cordova.dialogs',
'org.apache.cordova.geolocation',
'org.apache.cordova.inappbrowser',
'org.apache.cordova.vibration' ]

Я не знаю. Я что-то пропустил?

4b9b3361

Ответ 1

Попробуйте варианты, чтобы увидеть, работает ли он для вас, как и для меня:

var options = { enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(onSuccess, onError, options);

Ответ 2

Попробуйте это,

Удалить плагин геолокации

cordova plugin rm org.apache.cordova.geolocation

Однако убедитесь, что свойства AndroidManifest.xml и config.xml остаются такими

(in app/res/xml/config.xml)
<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.GeoBroker" />
</feature>


(in app/AndroidManifest.xml)
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

И для iOS в config.xml

<feature name="Geolocation">
    <param name="ios-package" value="CDVLocation" />
</feature>

Затем создайте приложение с помощью CLI и запустите приложение на устройстве/эмуляторе. Вы обнаружите, что теперь получаете код ошибки, а также сообщение onError для getlocation.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Даже после выполнения вышеуказанных шагов вы можете получить сообщение о тайм-ауте последовательно даже после установки {timeout:10000}. Решение для этого довольно забавно, просто выключите устройство и включите его и запустите приложение снова. Вы должны быть удивлены, увидев, что это работает, как и я!

Ответ 3

Мое решение состояло в том, чтобы использовать встроенную поддержку геолокации HTML5 для android/samsung, если она существует:

// BEFORE the deviceready event has fired:

// Check if HTML5 location support exists
app.geolocation = false;
if(navigator.geolocation) {
  app.geolocation = navigator.geolocation;
} 

// AFTER the deviceready event:

if(app.geolocation) {
  var locationService = app.geolocation; // native HTML5 geolocation
}
else {
  var locationService = navigator.geolocation; // cordova geolocation plugin
}

locationService.getCurrentPosition(
    function(pos) {

    },
    function(error) {

    }, 
    {enableHighAccuracy: true, timeout: 15000}
);

Для всех устройств Samsung, с которыми я тестировал, enableHighAccuracy должен быть "истинным" для этого. С не-samsung устройствами, такими как Nexus 7, enableHighAccuracy также может быть установлено как "false".

Ответ 4

Используя Phonegap и Genymotion, successHandler никогда не вызывался при попытке getCurrentPosition. Добавление параметров:

{enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0}

исправил это для меня.

Ответ 5

Согласно https://issues.apache.org/jira/browse/CB-5977, поддержка плагина Android была удалена. Yi Ming Kuan сказал: "Причина, по которой мы пошли с CB-5977, заключается в том, что веб-просмотр на новых версиях Android будет быстрее блокировать блокировку GPS, чем собственный API, поэтому его удаление. Добавление плагина на Android просто добавляет необходимые разрешения для использования HTML5 Geolocation в вашем приложении.

Ответ 6

  • проверьте файл config.xml.

удалить эту строку

<preference name="permissions" value="none"/>
  • загляните в свой AndroidManifest.xml

убедитесь, что все строки <uses-permission...> и строка <uses-sdk...> расположены перед тегом <application...>.

после этого удалите приложение вручную на телефоне и установите его снова.

надеюсь, что это поможет.

LG

fastrde

Ответ 7

Я думаю, что вы добавляете плагин вручную. используйте команду: (строго, если вы используете сборку CLI)

phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git

Ответ 8

У меня с вами такая же проблема, но, наконец, я ее решил.

Причиной возникновения этой проблемы является то, что мы всегда должны использовать функцию browser navigator.geolocation.getCurrentPosition для определения местоположения, поэтому мы должны позволить программе использовать встроенную реализацию cordova вместо html5.

Ответ 9

В этой теме есть много хороших ответов, спасибо для всех. Я хотел бы добавить свое решение в случае, если sb встретит то же самое.

Когда я запустил приложение Cordova 3.5 на своем Nexus, служба GPS не начиналась после этой строки:

navigator.geolocation.watchPosition(...);

Вместо этого я получил это сообщение:

07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation

Я был смущен, потому что не было никакого файла Java Geolocation.java вообще, несмотря на правильную установку плагина.

Когда выяснилось ответ Natsu, что команда Кордовы решила вызвать собственный объект браузера, я прокомментировал плагин Geolocation в cordova_plugins.js:

...
{
    "file": "plugins/org.apache.cordova.geolocation/www/Position.js",
    "id": "org.apache.cordova.geolocation.Position",
    "clobbers": [
        "Position"
    ]
} 
/*----
,
{
    "file": "plugins/org.apache.cordova.geolocation/www/geolocation.js",
    "id": "org.apache.cordova.geolocation.geolocation",
    "clobbers": [
        "navigator.geolocation"
    ]
}  
----*/
,
{
    "file": "plugins/org.apache.cordova.splashscreen/www/splashscreen.js",
    "id": "org.apache.cordova.splashscreen.SplashScreen",
    "clobbers": [
        "navigator.splashscreen"
    ]
},
...

Остальная часть установки плагина осталась без изменений. Таким образом, оригинальный объект Chrome не сбивается, и все работает нормально.

Теперь я немного не уверен, почему установщик плагина добавляет запись JSON, хотя это приведет к сбою. Я думаю, это просто небольшая слабость дизайна, которая не может быть исправлена ​​прямо сейчас (... или я должен углубиться в установку плагина).

EDIT: Не забывайте раскомментировать метаданные:

// "org.apache.cordova.geolocation": "0.3.8",
...

Ответ 10

Если код ошибки равен 3, проверьте, включено ли местоположение в настройках. Это работа для меня.

Ответ 11

добавление нижеследующего разрешения в файл манифеста решило мою проблему

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