20

PhoneGapを使用してアプリを構築しています。phonegapのGeolocationAPIを使用しているときに、APIが2つの理由でタイムアウトし、同じエラーがスローされることに気付きました。1.ユーザーのデバイスでGPSが有効になっていない場合2. GPSが有効になっていて、ユーザー(いくつかの理由、GPSの故障、天気の悪さなど)

原因の区別に問題がありますか?それを行う方法について何か考えはありますか?

Phonegapを使用してユーザーのデバイスでGPSがアクティブになっているかどうかを確認できる方法があるかどうか疑問に思っていたので、別の確認としてそれを実行し、通常GEO設定が配置されている設定ウィンドウにユーザーを誘導できます。それを行う方法がわかりませんか?カスタムphonegapプラグインはそうかもしれませんか?

4

6 に答える 6

37

getCurrentPositionの呼び出しで、 geolocationErrorのPositionErrorパラメーターのエラーコードを確認できます。gpsが有効になっていない場合はPositionError.PERMISSION_DENIEDになり、gpsが有効になっている場合はPositionError.POSITION_UNAVAILABLEまたはPositionError.TIMEOUTになると思いますが、他にも問題があります。

これはプラットフォームに依存することに注意してください。「現在の位置を取得できませんでした。GPS信号が弱いか、GPSがオフになっています」という不自然なエラーメッセージを作成する必要があります。

試すことができることの1つは、非常に小さなタイムアウト、たとえば1ミリ秒でgetCurrentPositionを呼び出すことです。許可が拒否されたと表示されている場合は、gpsが無効になっていると判断でき、タイムアウトした場合は、gpsが有効になっていると見なすことができます。私にはこれをテストする時間がありません、あなたはおそらくあなたのテストの結果でこの答えを編集することができます。

あなたが試すことができるもう一つのことは、Android用の診断phonegapプラグインを使用することです。他のプラットフォームのプラグインも使用していることを確認する必要がありますが、それらはすべてほとんどそこにあります。

于 2012-10-22T07:21:29.950 に答える
6

このケースを最も適切に処理するcordova.plugins.diagnosticには、GPS設定が有効になっているかどうかを確認し、(Android 6以降では)アプリにランタイム認証があるかどうかを確認し、(有効になっていない場合は)cordova-plugin-request-location-accuracyネイティブ経由でGPSを自動的にオンにするために使用できますユーザーが設定ページから手動でオンにする必要なしにダイアログを表示します。ただし、後者はデバイス上の最新のGoogle Playサービスライブラリに依存しているため、自動切り替えが失敗した場合は手動切り替えにフォールバックすることをお勧めします。

アプリのデモの例

まず、必要なプラグインをプロジェクトに追加します。

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save

次に、次のようにします。

function checkAvailability(){
    cordova.plugins.diagnostic.isGpsLocationAvailable(function(available){
        console.log("GPS location is " + (available ? "available" : "not available"));
        if(!available){
           checkAuthorization();
        }else{
            console.log("GPS location is ready to use");
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

function checkAuthorization(){
    cordova.plugins.diagnostic.isLocationAuthorized(function(authorized){
        console.log("Location is " + (authorized ? "authorized" : "unauthorized"));
        if(authorized){
            checkDeviceSetting();
        }else{
            cordova.plugins.diagnostic.requestLocationAuthorization(function(status){
                switch(status){
                    case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                        console.log("Permission granted");
                        checkDeviceSetting();
                        break;
                    case cordova.plugins.diagnostic.permissionStatus.DENIED:
                        console.log("Permission denied");
                        // User denied permission
                        break;
                    case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
                        console.log("Permission permanently denied");
                        // User denied permission permanently
                        break;
                }
            }, function(error){
                console.error(error);
            });
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

function checkDeviceSetting(){
    cordova.plugins.diagnostic.isGpsLocationEnabled(function(enabled){
        console.log("GPS location setting is " + (enabled ? "enabled" : "disabled"));
        if(!enabled){
            cordova.plugins.locationAccuracy.request(function (success){
                console.log("Successfully requested high accuracy location mode: "+success.message);
            }, function onRequestFailure(error){
                console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
                if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
                    if(confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
                        cordova.plugins.diagnostic.switchToLocationSettings();
                    }
                }
            }, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

checkAvailability(); // start the check
于 2016-07-16T10:42:26.407 に答える
3

一部のデバイスでも同様の問題が発生しました。以下のコードでそれを解決することができました:

var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
于 2013-10-28T16:54:49.827 に答える
1

上記のDaveAldenのソリューションを試しましたが、機能しませんでした。これは、彼が最初に呼び出す関数cordova.plugins.diagnostic.isGpsLocationAvailable()がAndroidのみであり、プラグインのドキュメントによるものであるためです。

彼が言うように、最初に2つのプラグインを追加します。

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save

次に、次の関数を追加します。

// Checks to see if GPS is enabled AND if the app is authorized
checkEnabled(){
    cordova.plugins.diagnostic.isLocationAvailable(
      (available) => { onSuccess(available); },
      (error) => { goToSettings(error); }
    );
}

onSuccess(available) {
  if(available) { // do something };
  else goToSettings(available);
}

// Output error to console
// Prompt user to enable GPS, on OK switch to phone settings
goToSettings(error) {
  console.log("error: ", error);
  if(window.confirm("You need to enable location settings to use the geolocation feature.")) {
    cordova.plugins.diagnostic.switchToSettings();
  }
}

checkEnabled(); // Run check

これがこの答えに沿って来る他の誰かを助けることを願っています。

于 2017-05-10T02:56:34.303 に答える
0

Apache Cordova3Androidプラットフォームを使用する

exectuteメソッドのGeoBroker.javaファイルで、locationManagerがインスタンス化された後、次のアクションを追加します。

if(action.equals("isGPSEnabled")){
            PluginResult result;
            if ( locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER )){
                result = new PluginResult(PluginResult.Status.OK);
            }else{
                result = new PluginResult(PluginResult.Status.ERROR);
            }
            callbackContext.sendPluginResult(result);
        }

次に、アセットのpluginsフォルダーにあるgeolocation.jsファイルに、新しい機能を公開するように追加します

 /**
     * Asynchronously checks if gps is enabled.
     *
     * @param {Function} successCallback    The function to call when gps is enabled.
     * @param {Function} errorCallback      The function to call when gps is not enabled. (OPTIONAL)
     */
    isGPSEnabled:function(successCallback, errorCallback){
        exec(successCallback, errorCallback, "Geolocation", "isGPSEnabled", []);
    }

それが役に立てば幸い

于 2013-10-21T15:34:50.257 に答える
0

ここにリダイレクトされた新しいユーザーのために、 Cordova診断プラグインと呼ばれるプラグイン(2014年の半ば頃に開始されました)があります:

iOS、Android、およびWindows10Mobile用のこのCordova/Phonegapプラグインは、ロケーション、Bluetooth、WiFiなどのデバイス設定を管理するために使用されます。実行時のアクセス許可、デバイスハードウェア、およびコアOS機能の管理を可能にします。ref

于 2016-07-02T05:39:15.997 に答える