• スポンサードリンク

Android10とUVC機器について調べた(´・ω・`)

Android USB

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の設定はこういうやつね。

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は次のようにして取得できます。

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と出力される)
  • 気にせずUsbManager#openDeviceを試みる…SecurityExceptionになる
    これはまぁ当然やな、パーミッション無いんやし

カメラパーミッション(android.Manifest.permission.CAMERA)関係ないやん…(T T)

とりあえず現時点(2019/09/04)でわかっているのはここまでです。何か進捗があれば追記します。
チャンチャン(T_T)/~~~

« »

  • スポンサードリンク

コメント