web-dev-qa-db-ja.com

PhoneGapを使用してGPSが有効になっているかどうかを確認します

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

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

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

20
Anoop Halgeri

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

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

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

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

37
Kinjal Dixit

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

Example app demo

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

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
6
DaveAlden

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

var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
3
George Artemiou

上記のDaveAldenのソリューションを試してみましたが、部分的に彼がcordova.plugins.diagnostic.isGpsLocationAvailable()を呼び出す最初の関数が plugin docs に従って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

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

1
OrdinaryHuman

Apache cordova 3 Androidプラットフォームを使用

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", []);
    }

それが役に立てば幸い

0
nicoabie

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

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

0
Morteza Tourani