bugfix> java > 投稿

現在、Javaコードからシステムコマンドを発行する必要がありますが、長い間スタックしています。私は多くのフォーラムと多くのコードスニペットを試してきましたが、すべてがアプリをクラッシュさせるか、何もしないようです 私が試した最後のコードは「エコー」で動作します しかし、「echo anystuff」を作成するとき> y.txt」というファイルを作成する代わりに、y.txtというファイルを作成し、ファイルに「anystuff」と書き込むと、「anystuff> 出力を確認するために作成したテキストボックスに「y.txt」 ここに私の方法があります

public void ShellTest() throws IOException {
    // test 10
    String cmd="echo anystuff > y.txt";
    StringBuffer cmdOut = new StringBuffer();
    Process process;
    try{
        // issue the command here
        process = Runtime.getRuntime().exec(cmd);
        // prepare to get back the result and put it in the textbox "resText"
        DataOutputStream stdin = new DataOutputStream(process.getOutputStream());
        stdin.writeBytes(cmd);
        InputStreamReader r = new InputStreamReader(process.getInputStream());
        BufferedReader bufReader = new BufferedReader(r);
        char[] buf = new char[4096];
        int nRead = 0;
        while ((nRead = bufReader.read(buf)) > 0){
            cmdOut.append(buf,0,nRead);
        }
        bufReader.close();
        try {
            process.waitFor();
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    } catch (IOException e){
        e.printStackTrace();
    }
    // check by the showing the output of the command in the textbox
    resText.setText(cmdOut); 
}

ところで私の電話はGoogle Pixel 2 XLです
助けていただければ幸いです!

回答 2 件
  • SuperUserとSuperSUを導入したChainfire社は、これらすべてを処理する優れたライブラリを作成しました。ライブラリをインストールすれば、うまくいきます!

    レイアウトファイル

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_gravity="center"
        tools:context=".MainActivity" >
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textAlignment="center"
            android:text="Shell Executer" />
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/input_text"
            android:hint="Example - ls" />
        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/execute_button"
            android:text="Execute" />
        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/clear_button"
            android:text="Clear" />
        <TextView
            android:id="@+id/output_text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:textAlignment="textStart" />
    </LinearLayout >
    
    

    Javaファイル

       public class MainActivity extends AppCompatActivity {
        Button execute, clear;
        EditText inputCommand;
        TextView outputResult;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            execute = findViewById(R.id.execute_button);
            clear = findViewById(R.id.clear_button);
            inputCommand = findViewById(R.id.input_text);
            outputResult = findViewById(R.id.output_text);
            outputResult.setMovementMethod(new ScrollingMovementMethod());
            execute.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    CommandResult result = Shell.SH.run(inputCommand.getText().toString());
                    outputResult.append("$ " + inputCommand.getText().toString() + "\n" +
                            "> " + result.toString() + "\n");
                }
            });
            clear.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    outputResult.setText("");
                }
            });
        }
    }
    
    

    結果: 画像結果

    ライブラリリンクと使用方法:https://github.com/jrummyapps/android-shell

    動作テストプロジェクト:https://github.com/waleedhammam/Android-Shell

  • リダイレクトはシステムコマンドの一部ではないためです。 (通常bash)シェルの機能。動作させるには、シェルを実行してから、シェルへの入力としてコマンドを入力する必要があります。単独でコマンドとして実行すると、すべてコマンドエコーの引数として解釈されます。

あなたの答え