在Android APK中呼叫底層linux命令或者指令碼
由於工作需要,接觸到百度語音識別SDK移植,由於需要實現在APK裡面控制物理硬體的效果,第一次接觸到Runtime.getRuntime().exec方法。
通過網上查閱資料,得知Runtime.getRuntime().exec的使用方法,程式碼如下:
Runtime.getRuntime().exec(cmd);
很簡單的使用方法,本來也以為就是這麼簡單,但是後面發現程式執行起來丟擲異常:IOException: Working Directory: null Environment: null
折騰了半天,發現原來是許可權的問題,各種查閱資料之後,找出瞭解決方法,執行proc必須是root使用者,需要先新增su許可權,程式碼如下:
try {
Process p = Runtime.getRuntime().exec("su");
p.getOutputStream().write(cmd.getBytes());
p.getOutputStream().flush();
} catch (IOException e) {
Log.e(TAG, "Runtime.getRuntime()");
}
測試了一下,依然是有問題,這次報錯:java.io.IOException: write failed: EPIPE (Broken pipe);
然後繼續找資料,將su改成sh,再進行測試,終於成功了,而需要改成sh的原因可能是因為執行shell命令需要shell使用者許可權。最後成功程式碼如下:
package com.baidu.android.voicedemo.util;
import java.io.DataOutputStream;
import java.io.IOException;
public class SystemFunction {
/**
* 行shell命令函式
*/
public String do_exec(String cmd) {
try {
Process exeEcho = Runtime.getRuntime().exec("sh");
DataOutputStream os = new DataOutputStream(exeEcho.getOutputStream());
os.writeBytes(cmd);
os.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cmd;
}
/**
* 點亮所有的藍色燈
* 燈光級別為最暗
*/
public void lightOnAll(){
//R:00 G:00 B:00
//寫藍色到sys節點 0x00 00 01
int ledID;
Process exeEcho;
try {
exeEcho = Runtime.getRuntime().exec("sh");
DataOutputStream os = new DataOutputStream(exeEcho.getOutputStream());
for(ledID = 0; ledID < Const.LED_ID.LIGHT_LED_MAX.ordinal(); ledID++){
String ARGS = "echo 1 > " + Const.LedPath[ledID] + "\n";
String result = "";
os.writeBytes(ARGS);
//result = do_exec(ARGS);
System.out.println(result);
os.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 滅掉所有的燈
*/
public void lightOffAll(){
//寫0到sys節點
int ledID;
Process exeEcho;
try {
exeEcho = Runtime.getRuntime().exec("sh");
DataOutputStream os = new DataOutputStream(exeEcho.getOutputStream());
for(ledID = 0; ledID < Const.LED_ID.LIGHT_LED_MAX.ordinal(); ledID++){
String ARGS = "echo 0 > " + Const.LedPath[ledID] + "\n";
String result = "";
os.writeBytes(ARGS);
//result = do_exec(ARGS);
System.out.println(result);
os.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
這裡一定要注意,執行的cmd後面一定要接一個換行符”\n”,因為DataOutputStream並不能直接操作底層shell,所以需要”\n”來標誌一條命令的結束。
好了,最後也能夠通過APK控制LED燈的亮滅了,成功。~~
相關推薦
在Android APK中呼叫底層linux命令或者指令碼
由於工作需要,接觸到百度語音識別SDK移植,由於需要實現在APK裡面控制物理硬體的效果,第一次接觸到Runtime.getRuntime().exec方法。 通過網上查閱資料,得知Runtime.getRuntime().exec的使用方法,程式碼如下:
java遠端呼叫linux的命令或者指令碼
Java通過SSH2協議執行遠端Shell指令碼(ganymed-ssh2-build210.jar) 使用步驟如下: 1.導包 官網下載: http://www.ganymed.ethz.ch/ssh2/ maven座標: [java] view plain copy print?
java中呼叫adb shell 命令啟動android應用程式
先把adb shell命令做成bat檔案,然後再程式中呼叫即可, adb shell am start -n com.sankuai.meituan/com.sankuai.meituan.act
Android: 通過Runtime.getRuntime().exec呼叫底層Linux下的程式或指令碼
Android Runtime使得直接呼叫底層Linux下的可執行程式或指令碼成為可能 比如Linux下寫個測試工具,直接編譯後apk中通過Runtime來呼叫 或者寫個指令碼,apk中直接呼叫,省去中間層或者JNI 這個至少效率應該比較高吧 程式碼:
android studio 中jni底層日誌的打印
添加 註意 erro ldl end 1.0 dto 字符 ati 1 添加ndk對log支持若需要添加ndk對log的支持,只需要通過以下2步即可實現。 1.1 修改Android.mk如生成的庫文件是“.so文件”,則在Android.mk中添加如下內容:LOCAL_L
測試過程中常用的linux命令之【查看文件指定行的內容】
sed head tail 在開展測試工作的過程中,通常要接觸到服務器,對於linux服務器,總結一些常用的命令。 準備工作為了能直觀展示命令結果,使用腳本創建一個文件,在顯示文件內容的同時,也直觀的顯示行號。#!/bin/bash FileName=TestFile.log touch ./$
測試過程中常用的linux命令之【查找指定的文件內容】
vi grep 之前遇到過這種情況,在查看日誌定位問題時,會將log 傳輸到本地,然後用本地的文本編輯工具打開文件,然後查找關鍵字,再進行分析。 這樣做無疑會降低效率。整理了幾個常用的命令,可以進行快速的查找。測試文件:文件名稱為execution.log, 文件內容如下:[error] Timed o
項目中常用的linux命令
gre rep ces 防火墻 修改 eas 刪除文件 當前 swd 2. pwd 獲取當前目錄路徑 3. tail -f file_path 顯示文件最後幾行內容(若文件內容變動,會動態更新後面幾行) 4. pgrep pro
Android開發中遇到的adb命令總結
1、獲取螢幕解析度: adb shell dumpsys window displays 2、修改裝置dpi : adb shell wm density 240 (以240dpi為例)
幾個Linux命令及指令碼使用中的奇淫巧技
例項1.建立一個別名,刪除原始檔案,同時在使用者的home目錄下backup中儲存副本。 #/bin/bash cp [email protected] ~/backup && rm -rf [email protected] 例項2.For
Linux學習總結(49)——應當竭力避免在系統中執行的 Linux 命令
前言 如果你是一個 Linux 新手,在好奇心的驅使下,可能會去嘗試從各個渠道獲得的命令。以下是 7 個致命的 Linux 命令,輕則使你的資料造成丟失,重則使你的系統造成癱瘓,所以,你應當竭力避免在系統中執行它們。 一、rm -rf 此命令將遞歸併強制刪除 / 目錄下的所有檔案。這
在Android Studio中呼叫so中的方法
本節用的so是上節用Android Studio建立的so。想在Android Studio中呼叫so中的方法,需要先引用so。Android Studio中引用so的方法有二種,下面開始介紹。 一 引用so 在app/src/main目錄下新建Directory,命名資料夾為jniL
在IIS7.5中呼叫執行cmd命令生成檔案失敗
專案是這樣的,C++人員寫了一個dll,便於跨平臺呼叫,所以用的是控制檯介面傳參呼叫,目的是生成一個檔案。程式碼編寫完成後,本機沒問題,釋出到阿里雲伺服器始終呼叫不成功,而直接在cmd介面是可以呼叫執行成功的。程式碼主要如下: /// <summar
工作中常用的linux命令小結
linux檔案傳輸 拷貝本地資料夾到目標機器 scp -r /home/search [email protected] : home – 拷貝資料夾,加-r引數 查詢檔案內容 查詢關鍵字,選取第四、七列、最後5千行,定位輸出到檔案中 grep "GET /
php中如何執行linux命令詳解
前言 本文主要給大家介紹了關於在php中如何執行linux命令的相關內容,下面話不多說了,來一起看看詳細的介紹吧 php如何執行某個命令 ,官方手冊在這裡 我們先從shell_exec來說 如何使用shell_exec在php裡面執行shell命令 先來試一下,使用php執行某個
Android Studio中呼叫高於minSdkVersion版本API, 無提示 (Lint問題),開啟api版本檢測
一. 坑: 呼叫高於minSdkVersion版本的API時, AS無提示 ! 最近重構專案時用到了HandlerThread類, 程式碼中呼叫了此類的quitSafely()方法, 結果導致了下面的錯誤: 呼叫高版本api導致的crash.png 經過一番折騰,
系統呼叫實現Linux命令 ls -al
二話不說直接上程式碼(這是我之前在網易部落格上寫的搬過來) ls.c 如下: #include "ls.h" /**********************************************************************/ //將路徑定位到
android webview中呼叫了js的時候混淆注意事項
今天有一個bug,就是webview跟js互動的方法怎麼也調不起來,debug包沒問題,release包就出錯,想想是打包時混淆的問題,打了一個不混淆的包,果不其然,就是混淆的問題。 然後就找解決方案,在proguard-project檔案中有這麼一句 <span s
PHP開發中常用的Linux命令之:遠端遷移伺服器專案篇
遷移伺服器專案 從伺服器拷貝檔案到另一個伺服器命令: scp filename@ip:filepath 例如:scp /var/www/html/檔名 @10.21.22
velocity中呼叫Java程式碼無效或者無法debug
velocity呼叫Java程式碼的標準寫法是這樣的 $!{classname.staticMethod()}或者$!{objectname.instanceMethod()} 比如: $!{sale