Android10が降ってきた
Pixel3とEssential Phone PH-1にAndroid10が降ってきました。
ということでAndroid10とUVC機器について調べてみました。
先に結論な
先に結論を書いておきます。
現時点では、Android10ではtargetSdkVersion=28以降に設定したアプリではUVC機器へはアクセスできません。パーミッションの取得がそもそもできません。
Android10でもtargetSdkVersion=28未満なアプリでは従来どおりアクセス可能です。
また、Android9のMoto G6 PlusではtargetSdkVersion=28でもUVC機器へ正常にアクセスできるのでこのふるまい/不具合はAndroid10固有のものです。
じゃぁtargetSdkVersion=28未満にしとけばええやんと思う人も居るかと思いますが、残念なことに2019年11月からGoogle Playで新規・バージョンアップ問わずtargetSdkVersion=28が必須になります。
Expanding target API level requirements in 2019
色々調べた
Android10にアップデートしたEssential Phone PH-1/Pixel3で確認してみました。
なにはともあれAndroid Developers
Android DevelopersでAndroid9/10での変更点とUSB関係のドキュメント読む限りは該当する事項は存在していません(。・_・。)
どうしろってんだよ?
Android9からCamera 2APIでUVC機器使えるようになるらしいって話があったよね?
UVC機器にパーマネントパーミッションに付与できるようにAndroidManifest.xmlを設定してパーミッション付与をした状態でAPI21以降のCameraManager.getCameraIdListを呼んでも検出できるのは端末内蔵カメラだけでUVC機器は検出できない…つまりCamera2API経由でのUVC機器アクセスは不可能ということです。
AndroidManifest.xmlの設定はこういうやつね。
1 2 3 4 5 6 |
<intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> |
AOSPのドキュメントにCamera 2API経由でのUVC機器アクセスを有効にするためのカーネル側の変更点についての記述はあるんだけど、Pixel3とPH-1では有効になっていないみたいです。
External USB Cameras
システム側でパーミッション付与したときのIntentを確認した
先程と同じく、UVC機器にパーマネントパーミッションに付与できるようにAndroidManifest.xmlを設定したアプリをインストールした端末へ、USB機器を接続すると、アプリへパーミッション付与するかどうかまたはどのアプリでそのSUB機器を使うかの選択するためのシステムダイアログが表示されます。
Android9までの端末またはAndroid10でtargetSdkVersion=28未満の場合はこのシステムダイアログでアプリを選択すると、対象アプリにEXTRA_DEVICEとEXTRA_PERMISSION_GRANTEDがetraに入ったIntentが飛んでアプリ起動します。
Android10の場合もtargetSdkVersionに関わらずIntentが飛んでくるのですが、Android10&targetSdkVersion=28以上ではEXTRA_PERMISSION_GRANTEDのエキストラが常時未設定/falseになりパーミッションが付与されていません。
EXTRA_DEVICEエキストラにはUsbDeviceオブジェクトが設定されていますが、このUsbDeviceを使ってUsbManager#hasPermissionを呼んでも結果はfalse(パーミッションが無い)でした。
じゃあUVC以外のUSB機器はどうやねん
当然の疑問としてUVC以外のUSB機器はどないやねんという疑問が湧いてきますよね。ということでこちらも確認してみました。
とりあえずtargetSdkVersionを変更して確認できるUSB機器ということで、Movidius Neural Compute Stickを試してみました。いきなりマニアックなUSB機器つなごうとするんやな?
Android9までもしくはtargetSdkVersion=28未満であればAndroid10でも正常に動作しました。またtargetSdkVersion=28にしてもAndroid10で正常に動作しました。
つまりAndroid10 + UVC機器 + targetSdkVersion=28以降のみがダメダメということです。
UsbManagerの振る舞い
UsbManagerは次のようにして取得できます。
1 |
final UsbManager manager = (UsbManager)context.getSystemService(USB_SERVICE); |
UsbManagerにはUSBアクセスするための重要なクラスで、主にUSB機器の列挙、パーミッション確認、パーミッション要求、USB機器のオープンの4つの機能があります。
UsbManager — Android Developers —
targetSdkVersion=28以降にしたときのUsbManagerの挙動は、UVC機器を示すUsbDeviceに対して
- UsbManager#hasPermissionは常時falseを返す
- UsbManager#requestPermissionは
- カメラパーミッションが無い時(android.Manifest.permission.CAMERA)…無視される
(logCatにUsbUserSettingsManager: Camera permission required for USB video class devicesと出力される) - カメラパーミッションがある時(android.Manifest.permission.CAMERA)…無視される
(logCatにUsbUserSettingsManager: Camera permission required for USB video class devicesと出力される)
- カメラパーミッションが無い時(android.Manifest.permission.CAMERA)…無視される
- 気にせずUsbManager#openDeviceを試みる…SecurityExceptionになる
これはまぁ当然やな、パーミッション無いんやし
カメラパーミッション(android.Manifest.permission.CAMERA)関係ないやん…(T T)
とりあえず現時点(2019/09/04)でわかっているのはここまでです。何か進捗があれば追記します。
チャンチャン(T_T)/~~~
コメント
[…] l Phone PH-1はAndroid 10にしてしまった後なのでAndroid 9だとどうだったのかわかりませんが、以前の記事で書いたとおりAndroid 10は色々と不具合があるのです…アプリのターゲットAPIがどうとか […]
[…] この間の記事Android10とUVC機器について調べた(´・ω・`)に書いたんだけど、先日公開されたばかりのAndroid10では現在わかっている限りtargetSdkVersion=28にするとUVC機器へのアクセスパーミッ […]