`

Android 应用程序发送shell命令

 
阅读更多
项目中需要直接在APP中通过发送shell指令来控制lcd灯,其实按理说应该是方案公司在调好lcd灯驱动之后直接通过service送接口上来给APP,APP调用就可以控制了,这是正规流程,但我们项目的方案商用的mtk方案,方案公司又没人会改,只调好了驱动,让应用程序自己实现灯的控制,这不蛋疼嘛!!!!

发就发吧!

一、关于shell指令:
我们知道,shell指令是Linux里面带的指令,指令是分权限的,所以需要根据你的具体指令看需不需要有系统权限;

二、权限介绍:
如果不需要root权限的shell指令那可以直接通过Android提供的exec发送,如果需要root权限,有两种操作方式:
1、标准做法或者说是推荐做法:
a、为APP添加
android:sharedUserId="android.uid.system"

b、用系统签名签APP(关于如何签名,参考:http://gqdy365.iteye.com/blog/2111949)
c、将签名好的apppush到system/app/目录下,重启;
这里可以使用exec正常发送任何指令;

2、屌丝做法:
设备获取root权限,APP运行时授予root权限;
发送时用exec("su")发送;
这种方法在调试阶段是很有用的。第一种方法调试会很多蛋疼的;

三、参考代码:
    Process process = null;
    DataOutputStream os = null;
	public void sendTest(String command){
        if (command == null) {
            return;
        }
        try {
            if(null==process){
//    			process = Runtime.getRuntime().exec("sh");//系统签名,push到app目录下用这个这个
    			process = Runtime.getRuntime().exec("su");//有root权限的用这个;
    			os = new DataOutputStream(process.getOutputStream());
            }
			if (MyLog.isDyeLevel()) {
				MyLog.log("lcd", MyLog.DYE_LOG_LEVEL, "execCommand :" + command);
			}
			os.write(command.getBytes());
			os.writeBytes("\n");
			os.flush();
        }catch(Exception e){
        	e.printStackTrace();
        }
	}

上面代码记得在不发送时关闭流;
我程序中需要实时发送,所以定义了全局变量,大家可以如果不需要实时发送,就定义局部变量;

下面片段是摘自Trinea的博客(http://www.trinea.cn/android/android-java-execute-shell-commands/)但存在一个问题:阻塞式的,会造成系统卡顿,不推荐使用;
        Process process = null;
        BufferedReader successResult = null;
        BufferedReader errorResult = null;
        StringBuilder successMsg = null;
        StringBuilder errorMsg = null;

        DataOutputStream os = null;
        try {
            process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
            os = new DataOutputStream(process.getOutputStream());
            for (String command : commands) {
                if (command == null) {
                    continue;
                }

                // donnot use os.writeBytes(commmand), avoid chinese charset error
                os.write(command.getBytes());
                os.writeBytes(COMMAND_LINE_END);
                os.flush();
                
                try {
					
				} catch (Exception e) {
					e.printStackTrace();
				}
            }
            os.writeBytes(COMMAND_EXIT);
            os.flush();

            result = process.waitFor();
            // get command result
            if (isNeedResultMsg) {
                successMsg = new StringBuilder();
                errorMsg = new StringBuilder();
                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);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (successResult != null) {
                    successResult.close();
                }
                if (errorResult != null) {
                    errorResult.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (process != null) {
                process.destroy();
            }
        }
0
0
分享到:
评论

相关推荐

    Google Android SDK开发范例大全(完整版)

    虽然没有 Eclipse 和 Android Developer Tools 插件也可以开发 Android 应用程序,但是那样就需要熟悉 Android SDK。 Android SDK 是作为一个 ZIP 文件发布的,可以将该文件解压到硬盘上的一个目录中。由于有多个 ...

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

    Notify4Scripts:一种包装应用程序,允许调用通知服务并通过shell命令构建通知

    一种包装应用程序,允许调用通知服务并通过Android Shell命令构建,触发,自定义通知 由于可以通过adb将外壳命令发送给Android设备,并且可以通过WiFi网络将计算机adb服务器连接到设备,因此Notify4Scripts允许通过...

    学习Monkey使用说明

    Money是Android中的一个命令行工具,可以运行在模拟器里或实际设备中它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。 Monkey测试是一种为了测试软件...

    PiZap:Raspeberry Pi作为FM广播发射机和开膛手。 用Android手机遥控

    Shell守护程序侦听http命令并将命令发送到linux服务,以启动/停止流传输android应用程序将http命令发送到守护程序: 开始/停止FM传输选择要收听的webradio的网址开始/停止翻录管理网络广播列表

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    13.2.2 创建WAVE播放器Android应用程序 306 13.2.3 创建WAVE播放器主Activity 306 13.2.4 实现WAVE Aduio播放 310 13.3 运行WAVE Audio Player 327 13.4 小结 328 第14章 程序概要分析和NEON优化 329 14.1 用...

    adb1.0.26包含fastboot.exe

    INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容设备 CPU 应用程序二进制接口的 native code INSTALL_FAILED_MISSING_FEATURE 应用使用了设备不可用的功能 INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 访问失败; 2...

    gpsinjector:使用其他Android设备的GPS功能!

    由于ChromeOS上的Android应用程序在隔离容器中运行,因此您不会碰运气警告:我不是Android开发人员,代码可能是很棒的意大利面。初次使用之前您将需要在接收设备上执行以下步骤。 安装GPS喷油器Lanunch应用程序,在...

    Android-LogMailer:这是一个 bash 脚本,它从连接到机器的 android 设备获取系统日志,检查过去一小时内的错误,然后在找到错误时将带有错误的自动邮件发送到指定的邮件列表。 它被设计为每小时执行一次 cron 作业

    例如,您可以进行一些更改,通过修改第 4 行的 logcat 命令或通过修改第 9 行的正则表达式变量来跟踪您正在跟踪的特定错误,以使其捕获与您正在测试的应用程序相关的日志。先决条件: 安装 Android SDK 时将 ...

    adb-tools.rar

    adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件: 客户端:用于发送命令。客户端在开发...

    workbench:一款桌面应用程序,可帮助车辆上载和移植,以为大众开放

    Openpilot的工作台Workbench是一个桌面应用程序,可帮助您管理在兼容的Android设备上运行的openpilot驾驶代理。 其目的还在于使新车辆的移植更加容易。 要获得对Workbench的支持,请在上与我联系。入门重要信息:...

    adb.zip连接安卓工具

    adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件: 客户端:用于发送命令。客户端在开发计算机...

    学习笔记之Android自动化测试工具Monkey

    它的原理是向系统发送伪随机的用户事件流(如按键输入、触摸输入、手势输入等),实现对正在开发的应用程序进行压力测试。至于Monkey的名字是有何而来的呢?这个没有去怎么考究,Monkey这个工具就是一个调皮的猴子,...

    BackgroundMode_Stream_Print:通过广播在后台获取音频模式和音频流

    现在使用以下命令进行广播:adb shell am broadcast -a android.intent.action.PACKAGE_ADDED现在查看日志,您将获得5种不同流的模式和音量。 现在您将了解模式,但要获取流,更改音量并再次发送广播。 现在查看...

    gnome-shell-extension-gsconnect:GNOME的KDE Con​​nect实现

    KDE Con​​nect团队拥有适用于Linux,BSD,Android,Sailfish,macOS和Windows的应用程序。 使用GSConnect,您可以安全地连接到移动设备和其他台式机,以: 共享文件,链接和文本 发送和接收消息 同步剪贴板内容...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java开源包1

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    JAVA上百实例源码以及开源项目源代码

    Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...

    java开源包11

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

Global site tag (gtag.js) - Google Analytics