web-dev-qa-db-ja.com

Phonegapジオロケーションが時々機能しないandroid

コルドバv3.4.1を使用してAndroidとiOSアプリを構築しています。iOSのジオロケーション機能は非常に速く戻り、常に正常に動作しますが、Androidでは動作しない場合があります。

奇妙なことに、Android電話を再起動した後、それは正常に動作します。数時間以上で、地理位置情報がwifiと3Gの両方で非常に迅速に表示されます。

しかし、サーバー時間後、私は再びアプリを開くと、地理位置情報が機能しません。時々私が外にいるとき、それはgps衛星で位置を取得できますが、非常に遅く、しばしばタイムアウトエラーが発生します。

アプリを削除して再インストールしようとしましたが、問題がまだあります。ただし、再起動しない限り、Android phone。リブートしたときに、Android phone、geolocation function今後数時間で再び正常に動作します。

私はsamsang note2、galaxy4などのテストサーバーAndroidの携帯電話を持っていますが、すべて同じ問題があります。再起動すると、非常に素早く場所を取得できます。

この問題は長い間私を悩ませてきたので、誰かが私を助けましたか?

以下は私のコードです:

navigator.geolocation.getCurrentPosition(function(pos){
                cb(null,pos)
            },function(errMsg){
    navigator.geolocation.getCurrentPosition(function(pos){  
            cb(null,pos)
    },function(errMsg){
    cb(errMsg)
    }, {
    enableHighAccuracy: true,
    timeout: 60*1000*2,
    maximumAge: 1000*60*10
   });
}, {
    enableHighAccuracy: false,
    timeout: 10*1000,
    maximumAge: 1000*60*10
});

私のconfig.xml:

<feature name="Geolocation">
    <param name="Android-package" value="org.Apache.cordova.geolocation.GeoBroker" />
</feature>
15
WuZhonghua

最後に私は問題を解決しました。今度は私のAndroid電話、getCurrentPosition関数が位置情報を非常に迅速に返すので、電話を再度再起動する必要はありません!よくわかりませんwether cordova v3.4.1のgeoloationプラグインにはバグがあります。

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

これがcordova v3.4.1での解決策です、それがあなたを助けることができることを願っています、実際それは私の質問を解決しました。

解決ステップ:

1. org.Apache.cordova.geolocationを削除します

$ cordova plugin rm org.Apache.cordova.geolocation

2.新しいorg.Apache.cordova.geolocationプラグインを再インストールします

$ cordova plugin add org.Apache.cordova.geolocation

3.プラグインをe:\にコピーします

「YOUR_APP_FOLDER\plugins \」などのプラグインフォルダを入力します

org.Apache.cordova.geolocationE:\org.Apache.cordova.geolocationにコピーします

4.プラグインを削除します

$ cordova plugin rm org.Apache.cordova.geolocation

5 .plugin.xmlE:\org.Apache.cordova.geolocation\plugin.xmlを編集します

以下のようにplugin.xmlファイルを編集します。

... ...
<name>Geolocation</name>
<description>Cordova Geolocation Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,geolocation</keywords>
<repo>https://git-wip-us.Apache.org/repos/asf/cordova-plugin-geolocation.git</repo>
<issue>https://issues.Apache.org/jira/browse/CB/component/12320638</issue>

<!-- Android Code Comments
<platform name="Android">

    <config-file target="AndroidManifest.xml" parent="/*">
        <uses-permissionandroid 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-file>

</platform>
-->

 <!-- Amazon-fireos change to Android-->
<platform name="Android"> 

    <js-module src="www/Coordinates.js" name="Coordinates">
        <clobbers target="Coordinates" />
    </js-module>

    <js-module src="www/PositionError.js" name="PositionError">
        <clobbers target="PositionError" />
    </js-module>

    <js-module src="www/Position.js" name="Position">
        <clobbers target="Position" />
    </js-module>

    <js-module src="www/geolocation.js" name="geolocation">
        <clobbers target="navigator.geolocation" />
    </js-module>

    <config-file target="res/xml/config.xml" parent="/*">
        <feature name="Geolocation">
            <param name="Android-package" value="org.Apache.cordova.geolocation.GeoBroker"/>
        </feature>
    </config-file>

    <config-file target="AndroidManifest.xml" parent="/*">
        <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-file>

    <source-file src="src/Amazon/GeoBroker.Java" target-dir="src/org/Apache/cordova/geolocation" />
    <source-file src="src/Amazon/GPSListener.Java" target-dir="src/org/Apache/cordova/geolocation" />
    <source-file src="src/Amazon/NetworkListener.Java" target-dir="src/org/Apache/cordova/geolocation" />
    <source-file src="src/Amazon/CordovaLocationListener.Java" target-dir="src/org/Apache/cordova/geolocation" />

</platform>

<!-- ios -->
<platform name="ios">
... ...

6.プラグインを再度追加する

$ cordova plugin add E:\org.Apache.cordova.geolocation

7、ビルドcommondを実行します

$ cordova build Android

8.正常に動作するかどうかを確認します

チェックYOUR_APP\plugins\Android.jsonには以下を含める必要があります:

{
   "xml": "<feature name=\"Geolocation\"><param name=\"Android-package\" value=\"org.Apache.cordova.geolocation.GeoBroker\" /></feature>",
   "count": 1
},
... ...
{
  "xml": "<uses-permission Android:name=\"Android.permission.ACCESS_COARSE_LOCATION\" />",
  "count": 4
},
{
   "xml": "<uses-permission Android:name=\"Android.permission.ACCESS_FINE_LOCATION\" />",
    "count": 4
},
{
  "xml": "<uses-permission Android:name=\"Android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\" />",
  "count": 1
 }

チェックYOUR_APP\platforms\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_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

チェックYOUR_APP\platforms\Android\res\xml\config.xmlには以下を含める必要があります:

<feature name="Geolocation">
    <param name="Android-package" value="org.Apache.cordova.geolocation.GeoBroker" />
</feature>

9.アプリを実行する

緯度と経度を取得するためのGeelocationコードを記述します。

navigator.geolocation.getCurrentPosition(function(pos){
            alert('suc')
            alert(JSON.stringify(pos))
        },function(errMsg){
               alert(JSON.stringify(errMsg))
               navigator.geolocation.getCurrentPosition(function(pos){  
                 alert('suc')
                 alert(JSON.stringify(pos))
               },function(errMsg){
                 alert(JSON.stringify(errMsg))
               }, {
               enableHighAccuracy: true,
               timeout: 60*1000*2,
               maximumAge: 1000*60*10
               });
          }, {
enableHighAccuracy: false,
timeout: 60*1000,
maximumAge: 1000*60*10

});

電話サポートがwifi/3Gを使用している場合は、位置情報をすぐに取得します。それ以外の場合は、errMsg timeoutが表示され、geolocationはgpsを使用してネイティブ実装の位置を検索します。

latとlngを取得しました。再起動する必要はありませんAndroid phone agian、ありがとうございます。

それでも問題が解決しない場合は、プラグインをインストールしてwebviewキャッシュをクリーンアップしてください:

https://github.com/moderna/cordova-plugin-cache

16
WuZhonghua

コルドバv5.3.3では、これを行う必要があります:

1、cordovaプラグインはcordova-plugin-geolocationを削除します

2、cordovaプラグインはcordova-plugin-geolocationを追加します

3、plguinsディレクトリのcordova-plugin-geolocationディレクトリをe:\にコピーします

4、plugin.xmlを編集し、これを追加します。

<js-module src="www/Coordinates.js" name="Coordinates">
    <clobbers target="Coordinates" />
</js-module>

<js-module src="www/PositionError.js" name="PositionError">
    <clobbers target="PositionError" />
</js-module>

<js-module src="www/Position.js" name="Position">
    <clobbers target="Position" />
</js-module>

<js-module src="www/geolocation.js" name="geolocation">
    <clobbers target="navigator.geolocation" />
</js-module>

<config-file target="res/xml/config.xml" parent="/*">
    <feature name="Geolocation">
        <param name="Android-package" value="org.Apache.cordova.geolocation.GeoBroker"/>
    </feature>
</config-file>

<config-file target="AndroidManifest.xml" parent="/*">
    <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-file>

5、cordovaプラグインはcordova-plugin-geolocationを削除します

6、cordovaプラグイン追加e:\ cordova-plugin-geolocation

7、cordova run Android=さて、gpsの位置がわかりました。WuZhonghuaに感謝します。

0
user2147549