Geolocationを両方のエミュレータでAndroidで動作させるのに問題があります(たとえgeo fix
telnet経由)およびデバイス上。 iOS、WP8、およびブラウザーで動作します。
次のコードを使用してデバイスの場所を尋ねると、常にエラーが表示されます(私の場合、カスタムRetrieving your position failed for unknown reason.
with 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)
platform/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>
Cordova 3.1.0を使用します。 Android 4.2。プラグインがインストールされています。index.htmlに含まれるCordova.js(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);
私の解決策は、Android/samsungが存在する場合、ネイティブHTML5ジオロケーションサポートを使用することでした。
// 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}
);
私がテストしたすべてのサムスンデバイスでは、これが機能するためにenableHighAccuracyが「true」である必要がありました。 Nexus 7などの非Samsungデバイスでは、enableHighAccuracyも「false」に設定できます。
これを試して、
位置情報プラグインを削除します
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" />
Config.xmlのiOSの場合
<feature name="Geolocation">
<param name="ios-package" value="CDVLocation" />
</feature>
次に、CLIを使用してアプリケーションをビルドし、デバイス/エミュレーターでアプリケーションを実行します。 getlocationのメッセージonErrorだけでなく、エラーコードが表示されるようになります。
詳細:上記の手順を実行した後でも、{timeout:10000}
を設定した後でも、タイムアウトメッセージが常に表示される場合があります。これに対する解決策は非常に面白く、デバイスのスイッチをオフにしてからオンにし、アプリケーションを再度実行するだけです。私と同じように動作しているのを見て驚くでしょう!
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バージョンのWebビューがネイティブAPIよりも速くGPSロックを取得するため、その削除です。したがって、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
マニフェストファイルに以下の権限を追加すると、問題が解決しました
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
エラーコードが3の場合、設定の場所が有効になっているかどうかを確認します。これは私の仕事です。
Cordova-plugin-geolocation最新バージョンには問題があります。以下のバージョンをお試しください
<plugin name="cordova-plugin-geolocation" spec="2.4.3" />
あなたと同じ問題を抱えていますが、ようやく解決しました。
この問題が発生する理由は、ブラウザーのnavigator.geolocation.getCurrentPosition関数を使用して常に位置を特定するため、html5ではなくCordovaネイティブ実装をアプリに使用させる必要があるためです。
このスレッドには多くの良い答えがあります。 sbが同じ問題に遭遇した場合に備えて、ソリューションを追加したいと思います。
NexusでCordova 3.5アプリを起動したときに、次の行の後にGPSサービスが開始されませんでした。
navigator.geolocation.watchPosition(...);
代わりに、私はこのメッセージを受け取りました:
07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation
プラグインが正しくインストールされていても、Java Geolocation.Java
]ファイルがまったくなかったため、混乱しました。
Natsuの回答 により、Cordovaチームがnativeブラウザーオブジェクトを呼び出すことを決定したことが明らかになったとき、私はコメントアウトしました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エントリを追加するのはなぜかわかりませんが、誤動作につながる可能性があります。現時点では修正できないのは、ほんの少しの設計上の弱点だと思います(または、プラグインのインストールをさらに深く掘り下げる必要があります)。
編集:メタデータのコメントを外すことを忘れないでください:
// "org.Apache.cordova.geolocation": "0.3.8",
...