0

外部 USB カメラを使用する Android アプリを作成しました。カメラの画像が全画面表示され、アプリがスクリーンショットを撮り、ローカル ファイル システムに保存します。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();

...これにより、ユーザーにスーパーユーザーのアクセス許可を付与するように求められ、ユーザーがルートになったことを知らせるフィードバックが返されますが、フォルダーのアクセス許可が変更されていないことが端末からわかります。

どんな助けでも大歓迎です

4

4 に答える 4

3

シェルは、標準入力 (OutputStream で行っているように) を介したコマンドの読み取り、または -c コマンド ライン オプションへの引数としてのコマンドの読み取りをサポートしています。たとえば、これは余分なオブジェクトを作成したくない場合にも機能するはずです。

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 ファイルを編集できるというコメントに追加します。これは機能するはずですが、これらのファイルは読み取り専用の /system パーティション (読み取り/書き込みで再マウントすることで簡単に編集できます) にあるか、おそらくいくつかのファイルのいずれかにあります。デバイスのパーティションにフラッシュされる ramdisk (gzip された cpio アーカイブ)。後者は、フラッシュ チップ上でその RAM ディスク イメージを見つけ、それを抽出し、ファイルを編集し、cpio を再作成し、フラッシュに書き戻さない限り、それほど簡単ではありません。

于 2013-11-20T15:52:24.427 に答える
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 経由で送信する必要があります。

于 2013-05-09T15:48:36.007 に答える