Ответ 1
Попробуйте варианты, чтобы увидеть, работает ли он для вас, как и для меня:
var options = { enableHighAccuracy: true };
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
У меня возникли проблемы с тем, чтобы 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' ]
Я не знаю. Я что-то пропустил?
Попробуйте варианты, чтобы увидеть, работает ли он для вас, как и для меня:
var options = { enableHighAccuracy: true };
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
Попробуйте это,
Удалить плагин геолокации
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}
. Решение для этого довольно забавно, просто выключите устройство и включите его и запустите приложение снова. Вы должны быть удивлены, увидев, что это работает, как и я!
Мое решение состояло в том, чтобы использовать встроенную поддержку геолокации 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".
Используя Phonegap и Genymotion, successHandler никогда не вызывался при попытке getCurrentPosition. Добавление параметров:
{enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0}
исправил это для меня.
Согласно https://issues.apache.org/jira/browse/CB-5977, поддержка плагина Android была удалена. Yi Ming Kuan сказал: "Причина, по которой мы пошли с CB-5977, заключается в том, что веб-просмотр на новых версиях Android будет быстрее блокировать блокировку GPS, чем собственный API, поэтому его удаление. Добавление плагина на Android просто добавляет необходимые разрешения для использования HTML5 Geolocation в вашем приложении.
удалить эту строку
<preference name="permissions" value="none"/>
убедитесь, что все строки <uses-permission...>
и строка <uses-sdk...>
расположены перед тегом <application...>
.
после этого удалите приложение вручную на телефоне и установите его снова.
надеюсь, что это поможет.
LG
fastrde
Я думаю, что вы добавляете плагин вручную. используйте команду: (строго, если вы используете сборку CLI)
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
У меня с вами такая же проблема, но, наконец, я ее решил.
Причиной возникновения этой проблемы является то, что мы всегда должны использовать функцию browser navigator.geolocation.getCurrentPosition для определения местоположения, поэтому мы должны позволить программе использовать встроенную реализацию cordova вместо html5.
В этой теме есть много хороших ответов, спасибо для всех. Я хотел бы добавить свое решение в случае, если 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",
...
Если код ошибки равен 3, проверьте, включено ли местоположение в настройках. Это работа для меня.
добавление нижеследующего разрешения в файл манифеста решило мою проблему
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />