Oppo Reno7 A ですべてのバイブレーションを無効化する
我が家では古くなった Oppo Reno7 A を使ってネットワークカメラを構築しているのだが、少なくともこの個体のOppo Reno7 Aには困った症状がある。
USB充電器を接続し続けていると、バッテリー100%時において頻繁にUSB充電器の切断・接続イベントが発生してしまう。このたびに充電開始を知らせるバイブが動き、カメラが動体検知してしまうのだ。この症状自体はどうにも直らないのだが、せめてバイブを無効化したい。
analysis
Androidのどのプロセスが充電の通知を発行しているかは分からないが、そもそも監視カメラとして扱っているので、全てのパッケージのバイブを無効化してしまえばいい。
Androidでは adb shell
に入って以下のようなコマンドを叩くことで、指定したパッケージごとにバイブの無効化を行うことができる。
cmd appops set [package] VIBRATE ignore
これを全てのパッケージに対して実行すれば良いのだが、実現するまでには若干苦労した。
probrem
Oppo Reno7 Aの設定アプリにアクセスし、開発者モードを有効化し、さらにUSBデバッグを有効化する。その状態で adb をインストールしたPCにOppo Reno7 Aを接続する。
詳細は割愛するが、ここで adb shell
を叩きOppo Reno7 Aのシェルにまで辿り着いたとする。
まず、以下のコマンドでパッケージの一覧が取得できる。
$ cmd package list packages package:android.frameworkres.overlay package:com.google.android.networkstack.tethering package:com.oplus.healthservice :
試しにひとつのパッケージに VIBRATE ignore
を指定してみる訳だが、以下のように権限が足りないと蹴られてしまうのだ。
$ cmd appops set android.frameworkres.overlay VIBRATE ignore Exception occurred while executing 'set': java.lang.SecurityException: uid 2000 does not have android.permission.MANAGE_APP_OPS_MODES. at android.app.ContextImpl.enforce(ContextImpl.java:2187) at android.app.ContextImpl.enforcePermission(ContextImpl.java:2196) :
resolution
これを解決するには、Oppo Reno7 Aの設定アプリ > 開発者オプションの最下段にある「認可の監視を無効化」を有効にし、USBケーブルを再接続する(もしかしたらOppo Reno7 Aを再起動したかもしれない)。
この状態でふたたび adb shell
に入り、再び VIBRATE ignore
を試すと、無事設定に成功した。
$ cmd appops set android.frameworkres.overlay VIBRATE ignore $ (成功の場合は何も返ってこない)
後はパッケージリストのすべての項目に対してこの設定を施すだけだ。以下のようにすればいい。
$ cmd package list packages | sed -e 's/package://g' | while read l; do cmd appops set $l VIBRATE ignore; done
この状態でUSBケーブルを抜き差しすると、バイブが一切動作しないことが確認できた。素晴らしい。