どうもこんばんわ。
Android 12、そろそろ正式リリースだと思うんですけど まーだ時間かかりそうですかねー
本題
rootアクセス
があるとか、ブートローダーがアンロック
されているとかならわかるんだけど、
なんでUSBデバッグ
ついてるとだめなんや(多分adb経由で画面録画とかができるのでそれのせい)
一時的にオフにすればいいじゃん
USBデバッグをOFFにするのって結構めんどいんだよね。
しかもONにするの忘れてるとか。ウィジェットを作ってUSBデバッグを有効、無効にするアプリとかクイック設定から変更できるようにしても良かったけどなんかなぁ。
だから作った
(600KBのGIFですのでモバイルデータの方ごめんね)
真っ暗の画面になってるのは、銀行系アプリが画面録画とかスクリーンショットを禁止しているせいです。
USBデバッグをOFFにしろってダイアログが出てないのでそれが証拠になるかと。
仕組み
USBデバッグをOFFにする
↓
USBデバッグをONにしてると怒られるアプリをIntent経由で起動
↓
アプリが終了(Activity Result API (onActivityResult)
/ onDestroy
)したらUSBデバッグをONに戻す。
ソースコード
使う権限は以下の2つです。
USBデバッグをアプリから有効、無効にする
には、WRITE_SECURE_SETTINGS
が必要なのですが、これはサードパーティアプリには開放されていません。
しかし何故かpm grant <パッケージ名> android.permission.WRITE_SECURE_SETTINGS
を実行すると権限を付与することが出来ます。YATTA YATTA
権限がゲットできればこっちのもんです。
アプリの終了検知
バックキーで戻ってきたときのために、Activity Result API (onActivityResult)
でを使います。
それとは別に、アプリ履歴画面から終了した際のためにonDestroy
も使います。
じゃあなんでサービス起動してるの?
startForegroundService
でフォアグラウンドサービスを起動してるわけですが、その理由はonDestory
でUSBデバッグをON
に戻せなかったからです。
でもなんかサービスを終了させるstopService
だけうまく動いたので、サービス側で戻すようにしました。onDestroy
、まじで謎
なんかフォアグラウンドサービス起動中ならアプリ履歴画面から終了させてもonDestroy
でUSBデバッグを有効にできる?
registerForActivityResult の引数を自作する
上記のActivityClose
クラスのことですね。ActivityResultContract
を継承して、ジェネリクス
の1個目の型は、画面遷移をする関数、launch()
に渡す値の型です。今回はIntentを渡すのでIntent
です。
2個目の型はコールバック時に返す値です。ここでは特に何も返さないのでUnit
です。
それから2つ関数がありますが、createIntent
に関しては引数のIntent
をそのままreturnして、parseResult
では特に何もしません。
ソースコードです
なお、WRITE_SECURE_SETTINGS
の権限があるかのチェックはしてないので、インストールしたら、以下のコマンドを実行して権限を付与してあげてください。(よって初回起動時は強制クラッシュします)
pm grant io.github.takusan23.usbdebugautohide android.permission.WRITE_SECURE_SETTINGS
https://github.com/takusan23/USBDebugAutoHide
おわりに
https://github.com/takusan23/DeveloperHide
アプリ書きました。そのうちPlayストアに出したい
提出はした、審査が通るかは知らんけど:https://play.google.com/store/apps/details?id=io.github.takusan23.developerhide