PhoneGapを使用してアプリを構築しています。 phonegapのGeolocation APIを使用しているときに、2つの理由でAPIがタイムアウトし、同じエラーがスローされることに気付きました。1。ユーザーのデバイスでGPSが有効になっていない場合2. GPSが有効になっており、位置情報を取得できない場合ユーザー(いくつかの理由、GPSの故障、不明瞭な天気など)
原因を区別するのに問題がありますか?それを行う方法について何か考えはありますか?
Phonegapを使用してユーザーのデバイスでGPSがアクティブであるかどうかを確認できるので、別の方法としてそれを行うことができ、通常はGEO設定が配置される設定ウィンドウにユーザーを導くことができるかどうか疑問に思っていました。その方法がわからない?カスタムphonegapプラグインはどうですか?
getErrorPosition の呼び出しで geolocationError のパラメーターである PositionError でエラーコードを確認できます。 gpsが有効になっていない場合はPositionError.PERMISSION_DENIEDになり、gpsが有効になっている場合はPositionError.POSITION_UNAVAILABLEまたはPositionError.TIMEOUTになりますが、他の問題があると推測しています。
これはプラットフォームに依存することに注意してください。 「現在の位置を取得できませんでした。GPS信号が弱いか、GPSがオフになっています」という不自然なエラーメッセージを記述する必要があります。
試すことができることの1つは、1 msなどの非常に小さなタイムアウトでgetCurrentPositionを呼び出すことです。許可が拒否されたと表示されている場合は、gpsが無効になっていると判断できます。タイムアウトした場合は、gpsが有効になっていると見なすことができます。これをテストする時間はありません。テストの結果でこの回答を編集することができます。
もう1つ試すことができるのは、 Androidの診断phonegapプラグイン を使用することです。他のプラットフォームにもプラグインを使用することを確認する必要がありますが、それらはすべてほとんどがそこにもあります。
このケースを最も適切に処理するには、 cordova.plugins.diagnostic
GPS設定が有効になっているかどうかを確認し、(Android 6+)でアプリにランタイム認証があるかどうかを確認し、(有効になっていない場合) cordova-plugin-request-location-accuracy
ネイティブダイアログを介してGPSを自動的にオンにし、ユーザーが設定ページを使用して手動でオンにする必要はありません。ただし、後者はデバイス上の最新のGoogle Play Servicesライブラリに依存しているため、自動切り替えが失敗した場合は手動切り替えにフォールバックすることをお勧めします。
最初に、必要なプラグインをプロジェクトに追加します。
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
一部のデバイスで同様の問題が発生しました。以下のコードで解決することができました:
var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
上記の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
これがこの答えに出会う他の誰かを助けることを願っています。
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", []);
}
それが役に立てば幸い
ここにリダイレクトされた新しいユーザーのために、 Cordova診断プラグイン と呼ばれるプラグイン(2014年中頃に開始された)があります。
このiOS用Cordova/Phonegapプラグイン、AndroidおよびWindows 10 Mobileは、ロケーション、Bluetooth、WiFiなどのデバイス設定を管理するために使用されます。ランタイム許可、デバイスハードウェア、コアOSの管理を可能にします機能
ref