web-dev-qa-db-ja.com

Phonegap / Cordova位置情報が機能しないAndroid

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' ]

私は無知です。何か不足していますか?

20
Kreeki

この方法でオプションを試して、それがあなたにとってうまくいくかどうかを確認してください:

var options = { enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
15
ASP Force

私の解決策は、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」に設定できます。

6
henryfi

これを試して、

位置情報プラグインを削除します

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}を設定した後でも、タイムアウトメッセージが常に表示される場合があります。これに対する解決策は非常に面白く、デバイスのスイッチをオフにしてからオンにし、アプリケーションを再度実行するだけです。私と同じように動作しているのを見て驚くでしょう!

6
Dipin Krishnan

PhonegapとGenymotionを使用して、successHandlergetCurrentPositionを試みたときに呼び出されたことはありませんでした。オプションの追加:

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

私のためにこれを修正しました。

5
Maxirus

https://issues.Apache.org/jira/browse/CB-5977 によると、Androidプラグインのサポートは削除されました。 Yi Ming Kuan氏は、「CB-5977を使用した理由は、新しいAndroidバージョンのWebビューがネイティブAPIよりも速くGPSロックを取得するため、その削除です。したがって、Androidは、アプリでHTML5 Geolocationを使用するために必要な権限を追加するだけです。」

3
romgar
  • config.xmlファイルを確認してください。

この行を削除

<preference name="permissions" value="none"/>
  • androidManifest.xmlを調べます

すべての<uses-permission...>行と<uses-sdk...>行が<application...>タグの前にあることを確認してください。

その後、電話でアプリケーションを手動でアンインストールし、再度インストールします。

それが役立つことを願っています。

lg

fastrde

2
fastr.de

プラグインを手動で追加していると思います。コマンドを使用:(CLIビルドを使用している場合は厳密に)

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

マニフェストファイルに以下の権限を追加すると、問題が解決しました

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
0
Maurice

エラーコードが3の場合、設定の場所が有効になっているかどうかを確認します。これは私の仕事です。

0
Yuri Giovani

Cordova-plugin-geolocation最新バージョンには問題があります。以下のバージョンをお試しください

<plugin name="cordova-plugin-geolocation" spec="2.4.3" />
0

あなたと同じ問題を抱えていますが、ようやく解決しました。

この問題が発生する理由は、ブラウザーのnavigator.geolocation.getCurrentPosition関数を使用して常に位置を特定するため、html5ではなくCordovaネイティブ実装をアプリに使用させる必要があるためです。

0
WuZhonghua

このスレッドには多くの良い答えがあります。 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",
...
0
peter_the_oak