1. 程式人生 > >在Android APK中呼叫底層linux命令或者指令碼

在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