Google Playアプリ

デジスパイス/GL-770対応
GPS位置情報中継アプリ MLS

この記事は約22分で読めます。
記事内に広告が含まれています。
スポンサーリンク

Android スマホの位置情報の精度と更新レートを向上させるために開発した
Android アプリの「
GPS位置情報中継アプリ MLS」について、
使用方法を紹介します。

GPS位置情報中継アプリ MLS

Bluetooth LE搭載(LNSプロファイル)のGPSロガーにBluetooth接続し、GPSロガーから受信した位置情報をスマホの位置情報として、中継するサービス型アプリです。
位置情報を使用して動作するアプリは、スマホ内蔵GPSの位置情報ではなく、GPSロガーの位置情報で動作するようになります。

GPSロガーから受信したGPS 位置情報は、スマホ上のアプリがスマホ内蔵GPSとして、認識・動作します。
最初にGL-770に接続、測位レートを表示。次に5Hz モードに設定したデジスパイスⅣに接続、測位レートを表示させたまま、デジスパイスⅣのセッティングで、5Hzモード → 10Hzモード → 20Hzモードに変更しています。
<strong>重要ポイント</strong>
重要ポイント

アプリのインストール前にスマホ本体の設定で「開発者向けオプション」を有効 にし、 インストール後に 「仮の現在地情報アプリを選択」で “MLS” を選択 してください。
詳しくは、こちらです。

GPS位置情報中継アプリ MLS

Bluetooth LE搭載(LNSプロファイル)のGPSロガーにBluetooth接続し、Androidスマホの位置情報に中継するアプリです。

開発した背景としては、スマホ内蔵 GPS の位置情報の取得が 1秒に 1回に対して、GPSロガーでは 1秒間に 5 ~ 10回と精緻に取得することが可能で、「GPSタイム計測アプリ Laps」や「GPS走行記録アプリ Archive」をスマホ内蔵GPSセンサーではなく、GPSロガーで動作させたいと思ったことがきっかけです。
簡単にAndroidスマホの位置情報を切り替えることを要件として、仕様検討、開発しました。

簡単にAndroidスマホの位置情報を切り替える
・GPSロガーに、接続でスマホの位置情報がGPSロガーに切り替わり、切断でスマホ内蔵GPSに切り戻しできる
・近くにあるBluetooth機器を検索でき、1タッチで接続できる
・接続した情報は保存でき、次回以降は接続操作のみで接続と切断は 1タップで操作できる
・アプリ本体は
サービスとして動作し、切断するまでバックグラウンドでアプリが動作し続ける
・別のアプリからサービス起動できる

GPSタイム計測アプリ Lapsから、シームレスで起動・停止が可能です。
動作環境

・Android 8 以降のスマートフォン
・GPSロガー(GL-770、GL-770M、デジスパイス3、デジスパイス4)で動作を確認しています

MLS(Mock Location Service)が動作中は、Android上で動作するアプリはスマホ内蔵GPSの代わりに、GPSロガーの位置情報を受け取って動作します。
ただし、位置ゲームなど疑似ロケーションでの動作を禁止しているアプリでは
動作しません

GPSロガーの位置情報をスマホに中継するアプリ – MLSをダウンロードできます↓↓↓

Google Play で手に入れよう

変更履歴(V5.2.36)
・GPSロガー検索でGPSロガーが見つけにくい現象を改善しました<new>
・エラーハンドリングを強化しました
<new>
・パラメータの並びを昇順に修正しました
<new>
・Transystem社のGPSロガー(GL-770M)に対応しました
<new>
・GPSロガーの速度単位の表示を追加しました<new>
GPSロガーの速度単位の自動判定を追加しました<new>
・Android14に対応しました
<new>
・タブレットに対応しました
・開発者オプションを有効化しているかチェックを追加しまし
・GPSロガーを検索する場合に位置情報が ON になっているかチェックするように変更しました
・GPS ロガーに接続完了で、メイン画面を自動で閉じるように変更しました
・通知画面からメイン画面の表示、アプリを終了できるように変更しました
・子画面のデザインと枠外タッチで画面を閉じるように変更しました

機能説明

MLSは、Bluetoothで接続可能な GPS ロガーを検索接続して、GPS ロガーから受信した位置情報を、位置情報を使用して動作するアプリに中継します。
MLSは、アプリからAPIで連携できるサービス型アプリです。

カテゴリ機能説明
検索デバイス検索近くにあるBluetoothデバイスを検索します。
MACアドレス指定接続するデバイスのMACアドレスを直接指定します。
接続デバイス接続デバイス検索からの選択、
MACアドレス指定のデバイスに接続して、
通信できる状態にします。
デバイス切断接続したデバイスとの通信を切断します。
中継位置情報プロバイダGPSロガーから受信した位置情報を
スマホの位置情報として中継します。
位置情報を使用して動作するアプリは、
GPSロガーの位置情報で動作します。
連携サービス別のアプリからサービス起動が可能です。
サービスとして動作し、
デバイス切断するまでバックグラウンドで動作します。

画面項目説明

各画面の画面項目について、説明します。

メイン画面

デバイスの検索、デバイスとの接続と切断する画面です。

①デバイス検索<searchアイコン>
タップすることで、近くにある Bluetooth 機器を検索します。
検索結果はデバイス一覧にリスト表示します(機器名が匿名の場合は、表示しません)

デバイス検索では、Bluetooth 機器の広告パケットを解析しています。
ペアリング設定すると広告パケットが出力されなくなるため、
ペアリングは解除してください。

保存しているデバイス情報を使用する場合は、ペアリングの解除は不要です。
デバイス検索を使用する場合のみ、一旦ペアリングを解除して、デバイス一覧からの接続後に、再度ペアリングしてください。

②接続ボタン
タップすることで、保存しているデバイス情報を使用して、デバイスに接続します。
デバイスの接続が完了し、位置情報の中継が始まるとメイン画面を自動で閉じます。

③メニュー
タップすることで、メニューを表示します。

Bluetoothデバイスを検索する
デバイスを検索します。

デバイスに接続する
④ MACアドレスの機器に接続します。

デバイスを切断する
④ MACアドレスの機器との接続を切断します。

システム設定
システム設定画面に遷移します。

ログ出力
開発者モードを有効にしている場合、記録した受信データをログ出力します。

ヘルプ
ブラウザで操作説明ページを表示します。

④デバイス名とMACアドレス
保存しているデバイス情報(デバイス名とMACアドレス)を表示します。

MACアドレスの下にGPSロガーの速度単位を表示します。

< デバイス検索結果 >

「GL7706711361」は、GPSロガー(GL-770)のシリアルナンバーです。

⑤デバイス一覧
近くにあるBluetooth機器を一覧表示します。
表示内容はデバイス名、MAC アドレス、アドバタイズのタイプです。
デバイス名をタップすると、デバイス機器に接続します。

< デバイス接続 >

⑥切断ボタン
タップすることで、接続しているデバイスを切断します。

⑦GPS情報
GPS ロガーから送信されてくるGPS情報を表示します。

⑧Google Map表示
GPSロガーから送信されてくるGPS情報でGoogle Mapを実行します。

GPSロガーは起動してから、位置情報の送信まで数分かかることがあります。
GPSロガーから位置情報を受信するまで
GPS情報は表示しません

通知画面

GPS ロガーの位置情報を中継するサービスを操作する画面です。

スマホの画面上部を下方向にスワイプすることで通知画面を開きます

①メイン画面<アイコン>
タップすることで、メイン画面を表示します。

②サービス終了<×アイコン>
タップすることで、位置情報を中継するサービスを終了します。

システムパラメータ画面

システムパラメータを変更する画面です。

①画面終了<×アイコン>
タップすることで、パラメータ画面を終了します。

②パラメータ一覧
パラメータをリスト表示します。
パラメータをタップすることで、パラメータ値の入力画面を表示します。

③メニュー
タップすることで、メニューを表示します。

閉じる
システム設定画面を終了します。

操作説明

各機能の操作方法について、説明します。

デバイス準備

①デバイス(GPSロガー)の電源をONにし、Bluetooth(BLE)を有効にします。

◎GL-770M(GL-770)

GL-770 のマニュアルより抜粋

◎デジスパイスⅣ(デジスパイスⅢ)

デジスパイスⅣ のマニュアルより抜粋

BLE を有効にしても、GPSロガー本体にログが記録されます。
GPS ロガー本体に記録したログを使用するソフトとの
併用が可能です。

①デバイス検索<search アイコン>をタップします。
近くにあるBluetooth機器を一覧表示します。

ペアリングを行うと、広告パケットが出力されなくなるため、デバイス一覧には表示されません。
タイミングによっては、広告パケットが届かない場合もあります。
デバイス一覧にGPSロガーが表示されない場合は、再度デバイス検索をタップして、デバイス一覧にGPSロガーが表示されるまで、デバイス検索を繰り返しください。

アプリで動作確認済みのGPSロガーです。

重要
GL-770Mの出荷時の更新レートは1Hzです。
 
こちらのサイトから、GPS Photo Tagger をダウンロードして、本体設定から5Hzに変更してください。
デジスパイス3、4で高度を取得する場合、システムパラメータ<RESERVED_FOR_FUTURE_USE>は
1を指定します。

デバイス接続(デバイス一覧からの接続)

①デバイス一覧から、デバイス(GPSロガー)をタップします。
GPSロガーに正常にデバイス接続できた場合、「接続しました」とメッセージ表示します。

デバイス一覧から接続する場合、GPSロガーの速度単位を自動判定します。
自動判定させたくない場合、ダイレクト接続を使用します。

デバイス接続(ダイレクト接続)

①接続ボタンをタップします。
GPSロガーに正常にデバイス接続できた場合、「接続しました」とメッセージ表示します。

デバイス切断

①メイン画面の切断ボタンをタップします。
または、通知画面のサービス終了<×アイコン>をタップします。

その他

画面項目や操作説明以外について、説明します。

システムパラメータ

システムパラメータ画面のパラメータ一覧から選択、パラメータ値を変更します。

ACCURACY(GPS ロガーの精度。初期値は10
DEVICE_MAC(GPS ロガーの MAC アドレス)
DEVLOG(開発者モードを有効にする場合は true、しない場合は false
MOCK_NETWORK_PROVIDERネットワーク位置情報も偽装する場合は true、しない場合は false
RESERVED_FOR_FUTURE_USE
デジスパイスを使用する場合は1 、初期値は1
UNIT
(GPSロガーの速度単位:km/h、m/s、knots)

VOLUME(効果音のボリューム(0.0~1.0)。初期値は1.0[最大])
ZOOM(Google Mapのズームレベルを指定。初期値は16

開発者モードを有効にした場合、GPSロガーから受信したデータをスマホ本体に蓄積します。
受信データを解析する場合のみ有効として、
通常の使用では無効にしてください。

インストール時に必ず実施してください

仮の現在地情報アプリとして動作させるために、スマホ本体の設定で「開発者向けオプション」を有効 にし、

「仮の現在地情報アプリを選択(※)」で “MLS” を選択 してください。
※Android12以降では、「仮の現在地強制変更アプリを選択」の表記に変更されています。

Android12の端末でインスト―ルしている動画です。Android11以前では位置情報の確認画面が異なります。
Bluetoothの確認画面は、Android12から追加になっています。

「開発者向けオプション」を有効にする方法
 ① Android本体メニューの設定(アイコン)をタップします。
 ②設定メニューから「システム」をタップします。
 ③システムメニューから「端末情報」をタップします。
 ④端末情報メニューの「ビルド番号」を7回タップします。

アプリからのサービス起動

以下のコードを記述することで、アプリ側からのサービス起動・停止が可能です。


//起動
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を習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポチッとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

  1. 初めまして。
    のっちと申します。

    1点質問があります。
    ご回答いただけると助かります。

    当方、ま@さんのブログより『MLS』の存在を知り、アンドロイドスマホにダウンロードしました。
    MLS経由で『RaceChrono』を開き、GPSロガーは『デジスパイスⅣ』をBluetoothにて認識させようとしましたが、認識してくれません。
    現在、スマホの開発者オプションの『場所』を『現在地情報の強制アプリ』を『MLS』にするところまでは出来た状態です。

    使用スマホ アンドロイド OPPO A55s 5G
    バージョン 12(最新バージョン) です。

    以上、お手数ですがよろしくお願いいたします。

    • ご質問ありがとうございます。
      無事、自己解決されたようですね!
      ポイントは、RaceChronoアプリからは内蔵GPS(高性能なスマホ)として認識されるということです。
      当方で動作を確認している動画です >>> https://youtube.com/shorts/Z5vzM2lftTo

      内蔵GPSとして動作するので、
      RaceChrono以外でもGPSを使ったアプリは動作すると思います。
      ただし、ポケモンGoなどの位置ゲームでは、
      内蔵GPS以外の位置情報を使用していると、
      チート行為とみなして、
      動かないようにしているアプリも存在しています。

  2. 度々申し訳ございません。
    のっちです。

    先ほどの件、無事レースクロノで20Hzで更新されていること、当方で確認できました。
    ですので、問題解決です^^

    以上、よろしくお願いいたします。

タイトルとURLをコピーしました