私はAndroidアプリを構築しました。外付けUSBカメラカメラ画像はフルスクリーンアプリで表示され、スクリーンショットを撮り、それらをローカルファイルシステムに保存します。 USBカメラが接続されると、次のフォルダを作成してストリーミングします。
/ dev / video0
カメラを取り外すたびにフォルダが破壊されます。
この問題は、私のアプリがこのフォルダから読み取る権限を持っていないため、カメラを接続するたびに権限を設定する必要があることです。
次のコードを使用して、アプリにアクセス許可を自動的に設定させようとしました。
Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"});
sh.waitFor();
...これは、ユーザーにスーパーユーザー権限を許可するように要求し、ユーザーがrootになったことを知らせるフィードバックを提供します - しかし、端末上で、フォルダで権限が変更されていないことがわかります。
どんな助けでも大歓迎です
回答:
回答№1の場合は3シェルは標準入力によるコマンドの読み取りをサポートしています(あなたがOutputStreamを使ってやっているように)またはそれに対する引数として - sコマンドラインオプション。
Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "/system/bin/sh -c "chmod 666 /dev/video0""});
これはシェルで実行することになります。
su -c "/system/bin/sh -c "chmod 666 /dev/video0""
あなたが望むなら、あなたはまずadbで試すことができます。
この特定のケースでは、とにかく1つのコマンドしか実行していないので、シェルを実際に必要とする必要はなく、おそらく単にこれを呼び出すことができます。
Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "chmod 666 /dev/video0"});
また、あなたが編集できることをコメントに追加するueventd.rcファイル:これは動作するはずですが、これらのファイルは読み取り専用/システムパーティション(読み書き可能で再マウントすることで簡単に編集できます)またはおそらくRAMディスク(gzip圧縮されたcpioアーカイブ)にあります。デバイス上のパーティション。後者は、そのRAMディスクイメージをフラッシュチップ上で見つけてそれを抽出し、ファイルを編集し、cpioを再作成してフラッシュに書き戻すことができない限り、非常に簡単ではありません。
回答№2の場合は0
あなたがカメラにそれらの許可を与えることの危険性について心配していないならば、あなたは加えることができます
/dev/video* 0666 system camera
に /ueventd.rc
.
回答№3の場合は0
私は結局次のような素晴らしいコードを見つけました。
Process sh = Runtime.getRuntime().exec("su", null,null);
OutputStream os = sh.getOutputStream();
os.write(("chmod 666 /dev/video0").getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();
何らかの理由で、コマンドはOutputStreamを介して送信する必要があります。
回答№4の場合は0
AndroidManifest.xmlにカメラの権限を追加するだけでいいのかもしれません。
<uses-permission android:name="android.permission.CAMERA"/>