【问题标题】:Run script with android app使用 android 应用程序运行脚本
【发布时间】:2013-03-30 13:20:13
【问题描述】:

我有这个 shell 脚本:

#!system/bin/sh
while :
do
sync
echo 3> /proc/sys/vm/drop_caches
echo "Script is been launched"
sleep 30m
done
exit 0;

我希望使用 android 应用程序运行此脚本。我现在已经创建了一个只有吐司的按钮。我如何获取脚本(free.sh)并使用应用程序上的按钮启动它?或者有没有用java重写代码的解决方案?谢谢

【问题讨论】:

    标签: android bash shell button


    【解决方案1】:

    首先,您将使用 Eclipse 创建一个简单的 Android helloworld 应用程序。 并在您的布局中添加一个按钮。这是非常初级的 Android 开发实践,您可以从http://d.android.com 中挖掘更多内容

    请在按钮的 onclick 回调函数中尝试此代码:

    Button b = (Button)findViewById(R.id.buttonPower);
            b.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Process p=null;
                    try {
                        p = new ProcessBuilder()
                        .command("PathToYourScript")
                        .start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if(p!=null) p.destroy();
                    }
                }
            });
    

    【讨论】:

    • 现在我在工作,所以当我回家时我会尝试。所以在 PATH_TO_YOUR_SH_SCRIPT 我会放例如 sdcard/free.sh 但在 VAR_FOR_YOUR_SCRIPT?有没有办法用另一个按钮停止外壳?非常感谢您的回答
    • 恐怕你不能把你的shell脚本放在SDCARD上,因为文件系统不允许你给一个文件任何X权限。您最好将文件放在您自己的缓存目录中,默认情况下位于 /data/data/com.yourpackage.name/files。如果您的脚本不带任何参数,只需传递空字符串:“”
    • mmh,现在外壳在 sdcard 上,如果我尝试用终端模拟器运行它。但是,如果不起作用,我将更改路径.. 但我仍然不明白 VAR_FOR_YOUR_SCRIPT 行上放了什么。 VAR_FOR_YOUR_SCRIPT 是什么意思?
    • java.lang.process 的使用请参考Android开发者网站。
    • 好的,我会看看这些,但我问你的唯一一件事是什么是 VAR_FOR_YOUR_SCRIPT?。
    【解决方案2】:

    以下是如何从您的 android 应用程序运行 shell 脚本

    try {
                Process process = Runtime.getRuntime().exec("sh /sdcard/test.sh");
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String listOfFiles = "";
                String line;
                while ((line = in.readLine()) != null) {
                    listOfFiles += line;
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
    

    【讨论】:

      【解决方案3】:

      好吧,现在没有错误(谢谢!)但什么也不做……尝试我编写了一个简单的脚本来编写 file.txt。见代码:

      package com.mkyong.android;
      
      import android.annotation.SuppressLint;
      import android.app.Activity;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.Toast;  
      import java.io.IOException;
      
      import com.example.toast.R;
      
      public class MainActivity extends Activity {
      
      
      private Button button;
      
      public void onCreate(Bundle savedInstanceState) {
      
          super.onCreate(savedInstanceState);
          setContentView(R.layout.tab1);
      
          button = (Button) findViewById(R.id.button1);
          button.setOnClickListener(new OnClickListener() {
              @SuppressLint("SdCardPath")
              @Override
              public void onClick(View arg0) {
                  Process p=null;
                  try {
                      p = new ProcessBuilder()
                      .command("/sdcard/Script/scritturafile.sh")
                      .start();
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                      if(p!=null) p.destroy();
                  }
              }
          });
      }
      }
      

      没有错误,但是当我按下按钮时,我认为 shell 没有运行,所以不要创建 file.txt

      【讨论】:

      • 这是日志的一部分:W/System.err(15320): java.io.IOException: Error running exec()。命令:[/sdcard/Script/scritturafile.sh] 工作目录:空环境。
      • 1.您应该先尝试执行 /system/bin/sh,然后重定向输入/输出,然后将脚本写入其输入流。 2. 即使你声明了你的写外部存储权限,也不代表你的子进程声明了。因此,如果您需要特殊许可,请尝试其他方式。
      • 我尝试了另一种方式..看看这个:stackoverflow.com/questions/15909530/…。现在我可以直接从 java 编写 bash 代码,但不是我想要的 xD。 mkdir,写一个文件 txt 或其他是的,但我想要的 (echo 3 > /proc/sys/vm/drop_caches) 不是。你能看看吗?我想我几乎达到了我的目标,但我错过了一些东西!真的很抱歉,我向你保证我会付一杯啤酒哈哈哈:)
      【解决方案4】:

      我的代码中有错误:

      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.Toast;
      
      import com.example.toast.R;
      
      public class MainActivity extends Activity {
      
          private Button button;
      
          public void onCreate(Bundle savedInstanceState) {
      
              super.onCreate(savedInstanceState);
              setContentView(R.layout.tab1);
      
              button = (Button) findViewById(R.id.button1);
      
              button.setOnClickListener(new OnClickListener() {
      
                  @Override
                  public void onClick(View arg0) {
                      Process process = new ProcessBuilder()
                      .command("PATH")
                      .redirectErrorStream(true)
                      .start();
                      try {
                          InputStream in = process.getInputStream();
                          OutputStream out = process.getOutputStream();
                          readStream(in);// Here: Syntax error, insert "}" to complete `Block`
      
                      finally {
                          process.destroy();
                      }
                  }
              }
              }); //Here: Syntax error on token "}", delete this token
          }
      
          protected void readStream(InputStream in) {
              // TODO Auto-generated method stub
          }
      }
      

      【讨论】:

      • 是的,我的示例代码与 Android 开发者网站上的示例代码相同,您可以轻松手动修复它。我的意思是,你还有其他错误吗?
      • 还没有 xD。但我真的无法解决这个问题。而且我不知道如何查看脚本是否真的运行。
      • 总是同样的错误...你能帮我获取我的代码并修复它吗?真的是我解决不了
      • 我发布的那个代码.. 2 天后我找不到错误。我无法修复它。请记住,我是 android 的新手开发人员,所以我看不到并修复一些错误是正常的。
      • 如果你想要我的电子邮件是 davide.dellai@hotmail.it
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多