2

Android ndk から USB ウェブカメラにアクセスしようとしています。

Android システムには V4L カーネル モジュールがあるため、V4L ライブラリを使用するのが最適であると考えました。それらは ndk にバンドルされているため、それらを私のプロジェクトに含めることは大したことではありませんでした。

私の問題は次のとおりです。

/dev/video4 を開き、ioctl をそのファイル記述子に送信する必要がありますが、/dev/video4 にアクセスする権限がありません。次の3つのことを考えました。

1) /dev/video4 に対する権限がないのはなぜですか? 私のアプリは android.permission.CAMERA パーミッションを使用するため、アプリを実行するユーザーはカメラ グループに属している必要があり、カメラ グループには /dev/video4 に対する r+w パーミッションがあるのに、なぜ開けないのですか?

2) UsbManager クラスで可能である Java 側からファイル記述子を取得しようとしましたが、そのファイル記述子ポイントは /dev/bus/usb/001/004 を行います。Java 側から /dev/video4 の許可を要求する方法はありますか? または、ユーザー空間 V4L ライブラリを含めて、ポインタを /dev/bus/usb/001/004 の汎用 USB デバイスに渡すことはできますか?

3) Android バージョンの OpenCV には V4L サポートが付属していますか? /dev/video4 にアクセスせずにカメラをプレビューするために使用できますか?

誰かが前にこのようなことを試したことがありますか?

また、libusb と libuvc を使用してカメラに接続するライブラリ ( https://github.com/saki4510t/UVCCameraなど) があることは知っていますが、このライブラリは非常に不安定で、満足のいく結果が得られません。

4

2 に答える 2

1

私がここにたどり着いたのは、あなたと同じ結論に達したからです。これ以上の提案はありません。何年も経った後、他に何か見つけましたか?

追加できるのは次のとおりです。

  • /dev/videoX ファイル記述子へのアクセスは、SELinux によってさらに制限されます。
  • android.permission.CAMERA は、あなたが思っていることをしません。マニフェスト内のこれらすべてのアクセス許可/機能設定により、アプリケーション フレームワーク サービスへのアクセスが可能になり、Linux グループのアクセス許可や SELinux とは関係ありません。
  • Camera2 フレームワークは前面と背面のカメラのみを列挙するため、USB カメラには使用できません。少なくともそのままでは使用できません。
  • V4L2 ドライバーは Android に存在しますが、「uvcvideo」ドライバーはデフォルトではありません。カスタムカーネルを構築する必要があります。
  • あなたが指摘した UVCCamera プロジェクトは、UsbManager (ユーザー空間の uvc パーサーを使用) を利用します。それが許可の問題を克服する方法です。それが唯一の方法のようですが、この実装は壊れやすく、一括モードに問題があるようです。

V4L2 + uvcvideo ドライバーだけを使用できないのは残念です。

于 2016-09-30T23:37:13.927 に答える
1

CAMERA 権限を持っていても、特定の Linux ユーザー グループに所属しているわけではありません。これは、Android OS の権限チェックの権限があることを意味します。

一般に、アプリケーションはカーネル ドライバー インターフェイスに直接アクセスできません。多くの場合、悪意のあるアプリケーションに対してドライバーが強化されていないため、これはセキュリティ上の大きな問題です。

ルート化されていないデバイスで機能する唯一の現在のソリューションは、Android パブリック USB API の上に UVC インターフェイス全体を構築する UVCCamera プロジェクトまたはそれに類する他のプロジェクトです。

さらに、一部の Android デバイスは実際には標準のカメラ API を介してウェブカメラをサポートしていますが、これはまだベースライン Android の機能ではありません。

于 2016-10-04T17:23:19.507 に答える