Google Playアプリ

GPS位置情報中継アプリ MLS

この記事は約19分で読めます。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

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

GPS位置情報中継アプリ MLS

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

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

MLS( Mock Location Service )

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

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

簡単にAndroidスマホの位置情報を切り替えできること
・GPSロガーに接続でスマホの位置情報が GPSロガーに切り替わり、
 切断でスマホ内蔵GPS に切り戻しできる。

・近くにある Bluetooth機器を検索でき、1タッチで接続できる。
・接続した情報は保存でき、次回以降は接続操作のみで接続と切断は 1タップで操作できる。
・アプリ本体は
サービスとして動作し、切断するまでバックグラウンドでアプリが動作し続ける。
・別のアプリからサービス起動できる。

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

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

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

この下にあるアイコンから、
GPS位置情報中継アプリ MLS をダウンロードできます。

Google Play で手に入れよう

変更履歴(V3.3)
・子画面のデザインと枠外タッチで画面を閉じるように変更しました<new>
・GPSロガーの速度単位のデフォルト値を m/s に変更しました<new>
・効果音のボリュームを調整できるように変更しました
<new>
DigSpiceⅢ、Ⅳ(デジスパイス3、4)で高度が取得できるようになりました
GPS位置情報の受信レートを表示できるようになりました
・メニュー背景の透過率を変更
しました
・GPS情報の現在位置をGoogle Mapで表示
する機能を追加しました
DigSpiceⅣ(デジスパイス4)
で動作することを確認しました
GPSロガーの受信データを解析するための開発者モードを追加しました
画面デザインを見やすく、メニューや Backキーでの操作に対応しました
・サービス側で効果音、メッセージを表示するように変更しました
・Android12対応( Bluetoothの権限付与のユーザ確認を追加)
・画面デザインを見やすく、操作しやすく改善しました
・操作時の効果音を追加しました
・方位(ベアリング)を出力できるようになりました

機能説明

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

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

画面項目説明

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

メイン画面

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

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

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

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

②デバイス接続<connectアイコン>
タップすることで、保存しているデバイス情報を使用して、
デバイスに接続します。

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

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

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

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

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

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

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

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

< デバイス検索結果 >

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

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

< デバイス接続 >

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

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

⑧Google Map表示
GPSロガーから送信されてくる GPS情報の現在位置をGoogle Map で表示します。

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

<システムパラメータ画面>

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

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

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

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

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

操作説明

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

デバイス準備

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

GL-770のマニュアルより抜粋
デジスパイス4のマニュアルより抜粋

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

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

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

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

重要
・GL-770 を使用する場合は、
 システムパラメータ( UNIT )は
km/h を指定してください。
・DigSpiceⅢ、Ⅳ(デジスパイス3、4)で高度を取得する場合は、
 システムパラメータ( RESERVED_FOR_FUTURE_USE )は
1 を指定してください。

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

①デバイス一覧でデバイス( GPSロガー)をタップします。
 GPSロガーに正常にデバイス接続できた場合、
 「接続しました」とメッセージ表示します。
 「接続できません」とメッセージが表示された場合は、
 デバイス切断( disconnectアイコンをタップ)して、
 再度、デバイス一覧からデバイスをタップしてください。

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

①デバイス接続< connectアイコン>をタップします。
 GPSロガーに正常にデバイス接続できた場合、
 「接続しました」とメッセージ表示します。
 「接続できません」とメッセージが表示された場合は、
 デバイス切断( disconnectアイコンをタップ)して、
 再度、デバイス接続( connectアイコン)をタップしてください。

デバイス切断

①デバイス切断< disconnectアイコン>をタップします。

その他

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

システムパラメータ

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

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() {
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        boolean         isMock = false;
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        try {
            String provider = locationManager.getBestProvider(criteria, true);
            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());
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return isMock;
    }

}

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

Google Play ギフトカードだったら、コンビニで買えますね(^^♪
 [ ギフトカード、ギフトコードを利用する方法 ]
 ①Google Play アプリ を開きます。
 ②右上のプロフィール アイコンをタップします。
 ③[お支払いと定期購入] [ギフトコードの利用] をタップします。
 ④コードを入力します。

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めての Android のアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

無料でJava言語を学べるのは、かなり魅力的♪
でも、応募資格は35歳以下です

未経験者からプログラマーを目指すのに最適かと、
まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、
お得なキャンペーンとかいろいろやっています♪


ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、
まずは無料オンライン相談から♪

コメント欄