Androidスマホの位置情報の精度と更新レートを向上させるために開発した
Androidアプリの「GPS位置情報中継アプリ MLS」について、
使用方法を紹介します。
スマホ本体の設定で「開発者向けオプション」を有効にし、「仮の現在地情報アプリを選択」でMLSを選択 してください。詳しくは、こちらです。
GPSレシーバをUSB接続する場合、GPSレシーバに給電する必要があります。
スマホ本体の設定でUSBホスト機能(OTG機能)を有効にしてください。
USBホスト機能の有効化については、ご使用のスマホのマニュアル等を参考ください。
激安のUSB接続GPSレシーバとデジスパイスⅣを比較検証した結果はこちら↓↓↓
GPS位置情報中継アプリ MLS
BLE搭載(LNSプロファイル)のGPSロガーにBluetooth接続、またはGPSレシーバにUSB接続し、受信した位置情報をAndroidスマホに中継するアプリです。
開発した背景としては、スマホ内蔵 GPSの位置情報の取得が1秒に1回に対して、GPSロガーでは1秒間に5~10回と精緻に取得することが可能で、「GPSタイム計測アプリ Laps」や「GPS走行記録アプリ Archive」をスマホ内蔵GPSセンサーではなく、GPSロガーで動作させたいと思ったことがきっかけです。
簡単にAndroidスマホの位置情報を切り替えることを要件として、仕様検討、開発しました。
簡単にAndroidスマホの位置情報を切り替える
・スマホの位置情報が、接続でGPSロガーに切り替わり、切断でスマホ内蔵GPSに切り戻しできる
・近くにあるBluetooth機器を検索でき、1タッチで接続できる
・接続した情報は保存でき、次回以降は接続操作のみで接続と切断は 1タッチで操作できる
・アプリ本体はサービスとして動作し、切断するまでバックグラウンドでアプリが動作し続ける
・別のアプリからサービス起動できる
動作確認済みデバイス以外を使用する場合、アプリが正しく動作しない場合があります。
動作確認済みデバイス以外での使用については、アプリ側での対応は致しかねます。
GPSロガーの位置情報をスマホに中継するアプリ – MLSをダウンロードできます↓↓↓
変更履歴(V6.2.46)
・システム画面のメニューにアプリ更新を追加しました<new>
・GPSレシーバ(BU-353N5)に対応しました
・GPSレシーバのUSB接続に対応しました
・デバイス一覧にペア設定済みのデバイスを表示するように変更しました
・画面デザインを変更しました
・GPSロガー検索でGPSロガーが見つけにくい現象を改善しました
・エラーハンドリングを強化しました
・パラメータの並びを昇順に修正しました
・Transystem社のGPSロガー(GL-770M)に対応しました
・GPSロガーの速度単位の自動判定を追加しました
・Android14に対応しました
・タブレットに対応しました
・開発者オプションを有効化しているかチェックを追加しました
・GPSロガーを検索する場合に位置情報が ON になっているかチェックするように変更しました
・GPSロガーに接続完了で、メイン画面を自動で閉じるように変更しました
・通知画面からメイン画面の表示、アプリを終了できるように変更しました
機能説明
MLSはBluetooth(USB)で接続可能なGPSロガーを検索・接続して、位置情報を使用して動作するアプリに、GPSロガーから受信した位置情報を中継します。
MLSはアプリからAPIで連携できるサービス型アプリです。
カテゴリ | 機能 | 説明 |
---|---|---|
検索 | デバイス検索 | 近くにあるBluetoothデバイス(またはUSB接続しているデバイス)を検索します。 |
接続 | デバイス接続 | デバイス検索からの選択、MACアドレス指定のデバイスに接続して、通信できる状態にします。 |
デバイス切断 | 接続したデバイスとの通信を切断します。 | |
中継 | 位置情報プロバイダ | GPSロガーから受信した位置情報をスマホの位置情報として中継します。 位置情報を使用して動作するアプリは、GPSロガーの位置情報で動作します。 |
連携 | サービス | 別のアプリからサービス起動が可能です。 サービスとして動作し、デバイス切断するまでバックグラウンドで動作します。 |
画面項目説明
各画面の画面項目について、説明します。
メイン画面
デバイスの検索、デバイスとの接続と切断する画面です。
①デバイス検索<searchアイコン>
タップすることで、近くにあるBluetoothデバイス(または、USB接続しているデバイス)を検索します。
検索結果はデバイス一覧にリスト表示します(デバイス名が匿名の場合は、表示しません)
ロングタップでペアリング済みデバイスのみリスト表示します。
②接続ボタン
タップすることで、選択デバイスに接続します。
デバイスの接続が完了し、位置情報の中継が始まるとメイン画面を自動で閉じます。
③メニュー
タップすることで、メニューを表示します。
デバイスを検索する
デバイスを検索します。
デバイスに接続する
④選択デバイスに接続します。
デバイスを切断する
④選択デバイスとの接続を切断します。
システム設定
システム設定画面に遷移します。
ログ出力
開発者モードを有効にしている場合、記録した受信データをログ出力します。
ヘルプ
ブラウザで操作説明ページを表示します。
④選択デバイス
選択しているデバイスを表示します。
BluetoothデバイスはMACアドレス、USBデバイスはベンダーコードとプロダクトコードを表示します。
⑤デバイス一覧
近くにあるBluetoothデバイス(または、USB接続しているデバイス)を一覧表示します。
表示内容はデバイス名、MAC アドレス(または、ベンダーコードとプロダクトコード)です。
ペアリングしているデバイスはPairedと表示します。
表示部分のタップでデバイスを選択します。
< USBデバイス設定 >
デバイス一覧からUSBデバイスを選択した場合、USBデバイス設定ダイアログを表示します。
選択デバイスの再設定は、デバイス検索から行います。
DEVICE
デバイス名を入力します。
TYPE & BAUD
デバイスの種類と通信速度を選択します。
UG-353の場合はUBX、BU-353N5の場合はAIRを選択します。
measRate
デバイスの更新レートを選択します(デバイスの種類がUBXまたは、AIRの場合)
dynModel
デバイスの動作モデルを選択します(デバイスの種類がUBXの場合)
速度や位置捕捉を最適化します。
minElev
受信対象の測位衛星の最小仰角を指定します(デバイスの種類がUBXの場合)
navMode
デバイスのナビゲーションモデルを選択します(デバイスの種類がAIRの場合)
速度や位置捕捉を最適化します。
dgps
DGPS(測位情報の誤差補正)のソースを指定します(デバイスの種類がAIRの場合)
< デバイス接続(Bluetooth) >
Bluetoothデバイスに接続中は受信データを表示します。
⑥切断ボタン
タップすることで、接続しているデバイスを切断します。
⑦GPS情報
GPSロガーから送信されてくるGPS情報を表示します。
精度のカッコ内の数値は受信した不良データ数です。
不良データがある場合は受信状態が良くないため、正確な位置情報を中継できません。
⑧Google Map表示
GPSロガーから送信されてくるGPS情報でGoogle Mapを実行します。
< デバイス接続(USB) >
USBデバイスに接続中は受信データを表示します。
⑦GPS情報
USB接続の場合、追加で衛星と精度を表示します。
衛星のカッコ内の数値は捕捉している測位衛星数、精度のカッコ内の数値は受信した不良データ数です。
測位衛星数が7未満、不良データがある場合は受信状態が良くないため、正確な位置情報を中継できません。
通知画面
GPSロガーの位置情報を中継するサービスを操作する画面です。
①メイン画面<アイコン>
タップすることで、メイン画面を表示します。
②サービス終了<×アイコン>
タップすることで、位置情報を中継するサービスを終了します。
システムパラメータ画面
システムパラメータを変更する画面です。
①画面終了<×アイコン>
タップすることで、パラメータ画面を終了します。
②パラメータ一覧
パラメータをリスト表示します。
パラメータをタップすることで、パラメータ値の入力画面を表示します。
③メニュー
タップすることで、メニューを表示します。
パラメータを初期化する
すべてのパラメータを初期状態に戻します。
アプリ更新
ブラウザでGoogle Play(アプリ)のページを表示します。
その他のアプリ
ブラウザでGoogle Playのページを表示します。
閉じる
システム設定画面を終了します。
操作説明
各機能の操作方法について、説明します。
Bluetoothデバイスを使用する場合は、電源とBluetoothをONにします。
USBデバイスを使用する場合は、スマホのUSB端子にデバイスを接続します。
アプリを起動すると、デバイス一覧にペアリング済みBluetoothデバイスまたは、USBデバイスが表示されます。
デバイス一覧からデバイスを選択し、接続ボタンをタップします。
デバイス準備
①デバイス(GPSロガー)の電源をONにし、Bluetooth(BLE)を有効にします。
◎GL-770M(GL-770)
◎デジスパイスⅣ(デジスパイスⅢ)
デバイス検索
①デバイス検索<search アイコン>をタップします。
近くにあるBluetoothデバイス(または、USB接続しているデバイス)を一覧表示します。
ロングタップでペアリング済みデバイスのみリスト表示します。
アプリで動作確認済みのGPSロガーです。
重要
・GL-770Mの出荷時の更新レートは1Hzです。
こちらのサイトから、GPS Photo Tagger をダウンロードして、本体設定から5Hzに変更してください。
・デジスパイスで高度を取得する場合、システムパラメータ(RESERVED_FOR_FUTURE_USE)に1を指定します。
・GPSモジュールがU-Blox7/8、AG3335MNのGPSレシーバのみUSB接続に対応しています。
・GPSレシーバのUSB接続には、タイプA→C変換(データ通信用)が必要です。
USB接続する場合は、タイプA→C変換が必要です。
電源用の変換ケーブル(コネクタ)ではUSB接続が認識できません。
デバイス選択
①デバイス一覧から、デバイス(GPSロガーまたは、GPSレシーバ)をタップします。
デバイス接続
①接続ボタンをタップします。
デバイス接続できた場合、「接続しました」とメッセージ表示します。
デバイス切断
①メイン画面の切断ボタンをタップします。
または、通知画面のサービス終了<×アイコン>をタップします。
その他
画面項目や操作説明以外について、説明します。
システムパラメータ
システムパラメータ画面のパラメータ一覧から選択、パラメータ値を変更します。
ACCURACY(GPS ロガーの精度。初期値は10)
DEVLOG(開発者モードを有効にする場合は true、しない場合は false)
MOCK_NETWORK_PROVIDER(ネットワーク位置情報も偽装する場合は true、しない場合は false)
PORT(マルチポートでUSB接続する場合にポート番号を指定。初期値は0)
RESERVED_FOR_FUTURE_USE(デジスパイスを使用する場合は1を指定。初期値は1 )
UNIT(GPSロガーの速度単位:km/h、m/s、knots)
VOID(不良データの乖離位置判定値(m)。初期値は10.0)
VOLUME(効果音のボリューム(0.0~1.0)。初期値は1.0[最大])
ZOOM(Google Mapのズームレベルを指定。初期値は16)
インストール時に必ず実施してください
仮の現在地情報アプリとして動作させるために、スマホ本体の設定で「開発者向けオプション」を有効 にし、
「仮の現在地情報アプリを選択(※)」でMLSを選択 してください。
※Android12以降では、「仮の現在地強制変更アプリを選択」の表記に変更されています。
アプリからのサービス起動
以下のコードを記述することで、アプリ側からのサービス起動・停止が可能です。
//起動
Intent intent = new Intent();
intent.setAction("MockLocationService");
intent.setPackage("com.gymtec.mls");
startForegroundService(intent);
//停止
Intent intent = new Intent();
intent.setAction("MockLocationService");
intent.setPackage("com.gymtec.mls");
stopService(intent);
アプリ側からサービスとして呼び出すには、AndroidManifest.xml に以下の記述が必要です。
<queries>
<package android:name="com.gymtec.mls" />
:
</queries>
位置情報がGPSロガーに置き換わっているか判定
以下のコードを呼び出すことで、アプリ側で Androidスマホの位置情報がGPSロガーに置き換わっているかの判定が可能です。
// 位置偽装判定 //
public boolean isLocationMocked() {
String[] providers = new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER};
boolean isMock = false;
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
try {
for (String provider : providers) {
Location location = locationManager.getLastKnownLocation(provider);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
// Android11以前
isMock = location != null && location.isFromMockProvider();
} else {
// Android12以降
isMock = location != null && location.isMock();
}
if (isMock) break;
}
} catch (SecurityException e) {
Log.d(TAG, String.format("isLocationMocked:%s", e.getMessage()));
e.printStackTrace();
}
}
return isMock;
}
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪
ポチッとして頂けると、
次のコンテンツを作成する励みになります♪
Google Play ギフトカードだったら、コンビニで買えますね (^^♪
[ ギフトカード、ギフトコードを利用する方法 ]
①Google Play アプリ を開きます。
②右上のプロフィール アイコンをタップします。
③[お支払いと定期購入] [ギフトコードの利用] をタップします。
④コードを入力します。
これからAndroidのアプリ開発やJavaでの開発を始めたい方へ
アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。
未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪
未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪
カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪
ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪
参考になったら、💛をポチッとしてね♪
コメント欄
初めまして。
のっちと申します。
1点質問があります。
ご回答いただけると助かります。
当方、ま@さんのブログより『MLS』の存在を知り、アンドロイドスマホにダウンロードしました。
MLS経由で『RaceChrono』を開き、GPSロガーは『デジスパイスⅣ』をBluetoothにて認識させようとしましたが、認識してくれません。
現在、スマホの開発者オプションの『場所』を『現在地情報の強制アプリ』を『MLS』にするところまでは出来た状態です。
使用スマホ アンドロイド OPPO A55s 5G
バージョン 12(最新バージョン) です。
以上、お手数ですがよろしくお願いいたします。
ご質問ありがとうございます。
無事、自己解決されたようですね!
ポイントは、RaceChronoアプリからは内蔵GPS(高性能なスマホ)として認識されるということです。
当方で動作を確認している動画です >>> https://youtube.com/shorts/Z5vzM2lftTo
内蔵GPSとして動作するので、
RaceChrono以外でもGPSを使ったアプリは動作すると思います。
ただし、ポケモンGoなどの位置ゲームでは、
内蔵GPS以外の位置情報を使用していると、
チート行為とみなして、
動かないようにしているアプリも存在しています。
度々申し訳ございません。
のっちです。
先ほどの件、無事レースクロノで20Hzで更新されていること、当方で確認できました。
ですので、問題解決です^^
以上、よろしくお願いいたします。