2016-08-15 5 views
-1

私のデバイスはルートになっています。私はadb経由でイベントを取得しています。しかし、アンドロイドアプリケーションのイベントの同じ連続ストリームを取得する方法を知っているわけではありません。以下のコードは、スーパーユーザの権限を求めるプロンプトを表示しますが、dntは何かを取得します。アンドロイドで/ dev/input/eventXを読むには?これはJNIを使​​用してのみ可能ですか、またはJavaのみを使用できますか?

 Process process = Runtime.getRuntime().exec("su"); 
    DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
    os.writeBytes("chmod a=rw /dev/input/event2" + "\n"); 
    os.flush(); 
    os.writeBytes("exit\n"); 
    os.flush(); 

    process.getOutputStream(). 
    final BufferedReader reader = new BufferedReader(newInputStreamReader(process.getInputStream())); 
    int read; 
    final char[] buffer = new char[4096]; 
    while ((read = reader.read(buffer)) > 0) { 
      stringBuilder.append(buffer, 0, read); 
      tv.setText(stringBuilder.toString()); 
      } 
      reader.close(); 

     // Waits for the command to finish. 
      process.waitFor(); 
    } 

答えて

0

suいくつかのコマンドを標準入力または何かに入力しようとしていますか?なぜかsu -c 'command1; command2'だけではない。

または、.exec("su")は現在のプロセスの特権を引き上げる予定ですか?それはどのように動作するのではありません。

bash───sudo───bash 

pstree -s $$から現在のシェルの両親を表示するために):あなたのコマンドラインからsuまたはsudo、プロセスツリーは次のようになります

同じターミナルでrootプロンプトを表示しても、実際にはルート以外のシェルフォーク+ execの後に別のシェルを実行していますsu.exec("su");が最初にフォークしない場合


だから、あなたはあなたのプロセスの代わりにexecve()ingsuして、現在のプロセスを置き換えています。これらのJava関数はわかりませんが、出力が得られないことが説明されています。関数呼び出しは返されず、プロセスはarg30のないsuに置き換えられます。

ああ、理論は、私はドキュメントをチェックし、.execは新しいプロセスでコマンドを実行します。 POSIX exec()よりもPO​​SIX system()に似ています。それでも、新しいプロセスを実行し、現在のプロセスにroot権限を与えません。私もあなたがなぜchmod\nをstdoutに印刷しているのか分かりません。

+0

コマンドを実行するにはroot権限が必要です。 - chmod a = rw/dev/input/event2 chmodの代わりに。私のデバイスのタッチスクリーンイベントである/ dev/input/event2の下の入力イベントを読むことができるように、このコマンドはルートとして実行されることを期待してrootアクセス権を持つプロセスの出力ストリームにこのコマンドを書いています。私が間違っているところを教えてください。そして、javaコードを通して/ dev/input/event2を読み込めますか? –

+0

@HimanshuGangwar:コマンドを 'su'にパイプするのではなく、' su -c 'chmod a = rw/dev/input/event2''を使用してください。とにかく間違っているのですが、入力ではなく出力に書きます。 –

関連する問題