車載のスマホ機器を作る際に必ずやりたいこととしてイグニッションONでスマホアプリ立ち上げがあると思いますが、これがなかなか簡単には出来ません。
なので、私が実際に車載スマホのOBDメーターで採用しているやり方を紹介します。
準備するもの
アンドロイドアプリのTasker、これでアプリの制御を行いますのでインストールをしてください。今回はTasker自体の使い方の説明はしませんので別のページを参考にしてください。
次から実際の設定について説明します。
Taskerの設定方法
アプリの自動起動を考えた場合に一番簡単に思いつく方法としては車のシガーなどのUSB端子にスマホにつないで、車体側USBからの給電開始をトリガーにアプリを立ち上げると言うものです。
これは一見うまくいきそうですが残念ながらうまくいきません。アプリが2回立ち上がったり、起動したアプリが終了してしまったりします。
理由としては実際にはエンジン始動時にUSB給電のイベントが複数回発生します。これはエンジンをかける際にUSB給電の電力が瞬間的に不安定になるためです。
その結果アプリ起動、終了イベントが複数回発生しこちらの想定どおりには動いてくれません。なのでここの判定をうまく出来るように設定を作っていきます。
それを踏まえて今回作るタスクがこちらです。
・電源ON
・電源OFF
・メーター起動
・メーター終了
電源ONタスク
電源ONタスクはとても単純です。
起動トリガーとしてUSB給電を利用します。そしてUSB給電タイミングで%POWERと言う変数に1をセットします。
これは何をしているかというと、エンジンONで複数のUSB給電イベントが発生することへの対応になります。イベントで給電判定するのではなくあくまでこの値を見て判断します。
電源OFFタスク
電源OFFのタスクも簡単です。
起動トリガーとして外部給電OFFを利用します。そして電源ONで%POWERにセットした値をクリアします。
メーター起動タスク
メーター起動タスクはこちらを参考にしてもらえば問題なく作れると思います。
起動トリガーとしてUSB給電を利用します。
ポイントとしては最初の8秒待つ部分です。ここで何をしているかというと、イグニッションON時の電源の瞬断によるイベントの誤検知を防いでいます。
そしてアプリを起動する際に電源ONタスクで作った変数%POWERを見て電源がONになっていることを確認し、さらに4で設定している自分自身が起動しているかのフラグ%TORを確認することで二重起動を防いでいます。
メーター終了タスク
起動トリガーとして外部給電OFFを利用します。waitを入れることで本当に電源が落ちているかを確認します。
その後一度HOME画面に戻していますが、こうしないとうまくアプリが落とせなかったためです。機種によっては不要かもしれません。
そしてステップ5でTorqueを終了させています。ここではTorqueアプリをスリープモードにしないで完全に落としています。最初はスリープモードで運用していましたが、どうがんばってもバッテリーが2日程度しか持たないためTorqueアプリを完全に終了させる方法に変えました。
そしてTorqueアプリを終了させるためには通常のアプリ終了ではダメで、Send Intentと言う機能を使います。そこから以下のコマンドを投げるとTorqueを完全に終了させることが出来ます。
org.prowl.torque.REQUEST_TORQUE_QUIT
最後にメーター起動タスクで作ったアプリが起動していることを表す%TORをクリアします。
まとめ
引っかかりポイントさえわかってしまえばそう難しい問題ではありません。
私がこの設定を作ったときにはネットで探してもなかなかこの問題を解決する方法が見つからなくて困りました。少なかったですがこの問題を解決できている人もいるようでしたが方法までは公開されていませんでした。
もし同じ問題で困っていてる方の手助けになれれば幸いです。
コメント