2013-04-08 58 views
5

我有了這個shell腳本運行腳本:與Android應用

#!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代碼?謝謝

回答

2

首先,您將使用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(); 
       } 
      } 
     }); 
+0

現在我在工作,所以當我回家我嘗試。所以在PATH_TO_YOUR_SH_SCRIPT我會舉例來說sdcard/free.sh,但在VAR_FOR_YOUR_SCRIPT?還有一種方法可以用另一個按鈕來停止shell嗎?非常感謝您的回答 – Davidebj 2013-04-08 13:55:09

+0

恐怕您無法將您的shell腳本放在SDCARD上,因爲文件系統不會讓您將任何X權限授予文件。您最好將文件放在您自己的緩存diretory中,默認情況下位於/data/data/com.yourpackage.name/files。如果您的腳本沒有采用任何參數,只需傳遞空字符串:「」 – Robin 2013-04-08 13:59:04

+0

mmh,現在shell已經在sdcard上了,如果我嘗試運行終端模擬器,它就會運行。但是,如果不起作用,我會改變路徑..但​​我仍然不明白VAR_FOR_YOUR_SCRIPT行是什麼。你對VAR_FOR_YOUR_SCRIPT的含義是什麼? – Davidebj 2013-04-08 14:02:50

0

我有錯誤。這是代碼:

package com.mkyong.android; 

import java.io.InputStream; 
import java.io.OutputStream; 

import android.app.Activity; 
import android.os.Bundle; 
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 

} 
} 
+0

是的,我的示例代碼與Android開發人員站點中的示例代碼相同,因此您可以很容易地手動修復它,並且我的意思是,您是否有其他錯誤? – Robin 2013-04-09 02:31:08

+0

還不是xD,但是我真的無法解決這個問題,而且我不知道該如何查看這個腳本是否真的存在。 – Davidebj 2013-04-09 08:45:32

+0

總是有相同的錯誤...你能幫我弄清我的代碼並修復它嗎我真的不能修復它 – Davidebj 2013-04-09 14:07:12

0

好了,現在沒有錯誤(THANK YOU!),但做nothing..to試試我已經寫了寫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(); 
      } 
     } 
    }); 
} 
} 

的是沒有錯誤,但是當我按下按鈕,我認爲殼不走,所以不要創建file.txt的

+0

這是日誌的一部分:W/System.err(15320):java.io.IOException:運行exec()時出錯。命令:[/sdcard/Script/scritturafile.sh]工作目錄:null環境。 – Davidebj 2013-04-09 16:13:54

+0

1.您應該嘗試首先執行/ system/bin/sh並重定向輸入/輸出,然後將腳本寫入其輸入流。 2.即使你已經聲明瞭你的寫入外部存儲權限,但這並不意味着你的子進程會這麼做。所以如果你需要特殊許可,請嘗試其他方式。 – Robin 2013-04-10 02:37:04

+0

我嘗試了另一種方式。查看此:http://stackoverflow.com/questions/15909530/drop-caches-by-app-doesnt-work。現在我可以直接從java編寫bash代碼,但不是我想要的xD。 mkdir,寫文件txt或其他是,但我想要什麼(回聲3>/proc/sys/vm/drop_caches)不是。你能看看嗎?我認爲我幾乎到達了我的目標,但我錯過了一些東西!真的很抱歉,我向你保證我會付出一杯啤酒:) – Davidebj 2013-04-10 07:47:03

0

這裏是你如何可以運行shell腳本從你的Android應用程序

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(); 
     }