PR
カレンダー
キーワードサーチ
フリーページ
コメント新着
DG-PRO1 GPSレシーバー 最高更新レート18Hz 防水 みちびき対応 Bluetooth 高精度 GPS Receiver for Android
価格:21987円(税込、送料別)
(2021/10/18時点)
GPSロガーアプリ
で使用しているDG-PRO1ですが、
不満な部分があります。
DG-PRO1単体では使用できないので、
専用アプリのDroggerGpsを使用します。
本体の設定から、疑似ロケーションの実行など。
この専用アプリ、非常によくできているのですが、
疑似ロケーションの終了後のアプリ側の後始末が悪いんです。
後始末が悪いとどんなことが起こるかというと、
疑似ロケーションを終了しても、
内部GPSを使用しているアプリで位置情報が取れなくなる現象が起こります。
この現象の対処としては、
スマホ本体の位置情報を解除して、再び位置情報を有効にします。
このあとに内部GPSを使用しているアプリを再起動するれば、
アプリから位置情報が取れるようになります。
この方法でダメなら、スマホ本体を再起動するぐらいでしょうか。
あと、別のアプリから(サービス)起動できるけど、停止できないこと。
これは、アプリから利用する側からすると致命的かな。
厳密にはアプリ(サービス)は停止できるが、DG-PRO1との接続が停止しない。
要するに、専用アプリのDroggerGpsを使用しないと、
疑似ロケーションを終了できないということ。
MLS
では、以下のようなことをして、
不満な部分を解消しています。
#内蔵GPSをもたない、wifiだけで位置情報を取得している端末の対応
#プロパティでネットワークのモック制御
boolean MOCK_NETWORK_PROVIDER = Boolean.parseBoolean(propertiesHandler.getProperty(properties, "MOCK_NETWORK_PROVIDER", "false"));
providers = MOCK_NETWORK_PROVIDER ?
new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER}:
new String[]{LocationManager.GPS_PROVIDER};
#モックプロバイダのアタッチ
#GPS位置情報(+ネットワーク位置情報)のモックプロバイダとして登録
private boolean attachMockLocation() {
try {
for (String provider : providers) {
locationManager.addTestProvider(provider,
false,
false,
false,
false,
true,
true,
false,
Criteria.POWER_LOW,
Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled(provider, true);
if (DEBUG) Log.d(TAG,String.format("attachMockLocation:%s", provider));
}
return true;
} catch (Exception e) {
Log.d(TAG, String.format("attachMockLocation:%s", e.getMessage()));
e.printStackTrace();
return false;
}
}
#モックプロバイダのデタッチ
#GPS位置情報(+ネットワーク位置情報)のモックプロバイダ削除
private void detachMockLocation() {
try {
for (String provider : providers) {
locationManager.clearTestProviderEnabled(provider);
locationManager.removeTestProvider(provider);
if (DEBUG) Log.d(TAG,String.format("detachMockLocation:%s", provider));
}
} catch (Exception e) {
Log.d(TAG, String.format("detachMockLocation:%s", e.getMessage()));
e.printStackTrace();
}
}
後始末が悪いのは、デタッチを正しく行えていないと思われます。
@Override
public void onDestroy() {
if (DEBUG) Log.d(TAG, "onDestroy");
if (handler != null) handler.removeCallbacks(runnable);
//MockLocationのデタッチ
if (providers != null) detachMockLocation();
//BLEコントローラーのデタッチ
if (bluetoothLowEnergyController != null) {
if (bluetoothLowEnergyController.requestBluetoothFeature()) {
bluetoothLowEnergyController.disconnect();
bluetoothLowEnergyController.pause();
}
}
super.onDestroy();
}
あと、サービス停止時に、DG-PRO1との接続が停止しないのは、
サービス側の onDestroy() に、
DG-PRO1との接続停止のロジックを書いていないと思われます。
別のアプリからの利用を想定していないのでというあれば、
そういうことなんでしょうけど。
エンジンオイルは気を使っているけど 2026.08.02
右リアタイヤがフレてますよ? 2026.07.19
Duelアプリで独り反省会 2026.07.07