前段时间工作中有这样一个需求,在公司的某种基于Android系统的产品上有4个mic,假如我们需要打开其中的一个mic来录音,Android标准API并没有提供这样的接口。这个时候,我们就可以在应用程序中直接获取相应的权限(比如su权限),然后执行相应的shell命令,打开这个mic来录音。 首先,我们需要和framework层同事和底层驱动层同事商量好,让他们提供shell命令。并且保证我们的应用可以获取su权限。而且,这个产品的开发板,是必须获取root权限的。 有了上面的几点要求,接下来我们就开始应用层的代码:
Process process = null; DataOutputStream os = null; BufferedReader successResult = null; BufferedReader errorResult = null; StringBuilder successMsg = null; StringBuilder errorMsg = null; try { //申请获取系统的su权限 //相当于执行了adb shell // su //如果获取不到su权限,或出现异常 process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.write(command.getBytes());//我们的命令 os.writeBytes(COMMAND_LINE_END); os.writeBytes(COMMAND_EXIT); os.flush();//发送出去 //下面这句会一直阻塞,直到返回结果 commandResult.result = process.waitFor(); //successMsg 和errorMsg用来获取成功或者错误消息 successMsg = new StringBuilder(); errorMsg = new StringBuilder(); //成功或者错误信息都可以通过process对象获取。我们可以通过process.getInputStream() == null或者 //process.getErrorStream()==null来判断是否执行成功。 successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); String s; while ((s = successResult.readLine()) != null) successMsg.append(s); while ((s = errorResult.readLine()) != null) errorMsg.append(s); commandResult.successMsg = successMsg.toString(); commandResult.errorMsg = errorMsg.toString();通过上述代码,如果正常情况下,可以顺利执行命令。但是,这是必须framework层和底层驱动配合的。确保我们的应用可以获取到su权限,或者,不用获取su权限,在普通用户sh情况下,依旧可以执行这种命令。