新手上路,请多关照。如本文有何不足之处,还望前辈们多多指教!

本文来通过实现一个从页面点击按钮,然后删除Android设备上指定文件的功能来简单介绍一下从页面操作Android设备的流程。


首先,下面的代码是当点击“删除”按钮后触发的js脚本

  

function(){            //该方法省略了一些代码,只保留核心代码...            var device = '';            var devices = adbCommand.getDevice(); //得到当前与电脑连接中的Android设备的序列号                                                  //这个getDevice()方法的实现见下面            if(!devices.length > 0) {                alert("请插入终端设备!");            }else{                if(devices.length > 0){                    device =  devices[0];                    //调用删除功能的函数,并得到执行结果                    var result = adbCommand.deletePad(device);//deletePad()方法实现见下文                    //通过执行结果判断是否执行成功,0代表成功,1代表失败                    if(result == 0 || result == "0" || result == '0') {                        alert("删除成功");                    } else {                        alert("删除失败");                    }                }            }        }/** 获取张端设备 **/function getDevice() {    //调用相应方法,执行adb devices这条命令,以查出Android设备的序列号    var result = exec("adb devices");    var line = result.split('\n');    var res = new Array();    if(line.length > 0) {        for(var i =1; i<line.length; i++) {            if(line[i]) {                var temp = line[i].replace(/(^\s*)|(\s*$)/g, "");                if(temp) {                    res[i-1] = line[i].split('\t')[0];                }            }        }    }    return res;}/** 执行传入的命令 **/function exec(cmd) {    var ret = getWSShell().exec(cmd);    var result = ret.StdOut.ReadAll();    return result;}/** 得到wscript.shell对象 **/function getWSShell() {    WSShell = new ActiveXObject( "WScript.shell" );    return this.WSShell;}function deletePad(cmd) {//将要执行的.bat文件的路径及其参数拼接成字符串,然后执行    return  execFile("D:/oa/DeletePad.bat " + cmd);}function execFile(cmdFile) {    var iReturnCode = getWSShell().run(cmdFile, 0, true);    return iReturnCode;}



到此为止,js脚本部分就写完了,下面看一下要执行的.bat文件的内容

set CLASSPATH=%CLASSPATH%;D:\oa\ctop.jarjava com.xxx.xxx.xxx.DataTranfer 2 %1

其中,D:\oa\ctop.jar要被执行的jar文件的全路径。第二行的java com.xxx.xxx.xxx.DataTranfer 是要被执行的Java类的包名和类名。后面的2和%1都是要传入的参数


下面看这个DataTranfer类的代码,其中省略掉无关的代码,只保留重要的

public class DataTranfer {    private static final String SERVER_TO_PAD = "0";    private static final String PAD_TO_SERVER = "1";    private static final String DELETE_PAD = "2";    private ADBCommand adb;    private String remoteDeletePath = "sdcard/ZC/";    /**     * 主函数     *     * @param args args[0] (0:功能1; 1:功能2; 2:删除功能 )     *             args[1] (设备号)     *             args[2] (待办号(用逗号分隔的字符串))     * @return     */    public static void main(String[] args) throws Exception {                if ((args.length == 3 && DataTranfer.SERVER_TO_PAD.equals(args[0])) ||                (args.length == 2 && DataTranfer.PAD_TO_SERVER.equals(args[0]))                || args.length == 2 && DataTranfer.DELETE_PAD.equals(args[0])) {            // 参数个数检测正常            System.out.println(args + "参数检测正常");        } else {            throw new Exception();//参数异常,退出        }        if (DataTranfer.SERVER_TO_PAD.equals(args[0])) {            DataTranfer dt = new DataTranfer();            dt.downLoadDataToPad(args[1], args[2]);        } else if (DataTranfer.PAD_TO_SERVER.equals(args[0])) {            DataTranfer dt = new DataTranfer();            dt.uploadDataToServer(args[1]);    } else if (DataTranfer.DELETE_PAD.equals(args[0])) {    DataTranfer dt = new DataTranfer();    dt.deleteDataFromPad(args[1]);    }    }    /**     * 这里就是初始化一些属性,不用关心     */    private void initVariables() {        adb = new ADBCommand();//这个类是执行命令的类,代码见下文        serverUrl = ConfigManager.getInstance().getServerBaseUrl();        localUpPath = ConfigManager.getInstance().getLocalUpPath();        remoteUpPath = ConfigManager.getInstance().getRemoteUpPath();        remoteDownPath = ConfigManager.getInstance().getRemoteDownPath();        localDownPath = ConfigManager.getInstance().getLocalDownPath();        remoteDeletePath = ConfigManager.getInstance().getRemoteDeletePath();    }    private String downLoadDataToPad(String deviceKey, String pendingSnos) {        //内容省略……    }    private String uploadDataToServer(String deviceKey) {        //内容省略……    }        /**     * 将PAD中的离线数据删除     *     * @param deviceKey Android设备序列号     * @return     */     private String deleteDataFromPad(String deviceKey){     String result = "删除成功!";     initVariables();     if (!"".equals(deviceKey.trim())) {     adb.setDevice(deviceKey);                //删除指定路径下的所有后缀为ini的文件               adb.exec(" rm -r  " + remoteDeletePath + "*.ini");                //删除指定路径下的所有文件               adb.exec(" rm -r  " + remoteDeletePath + "/upload/*");    }else{    result = "没有可用终端!";    }    return result;     }}

下面是ADB操作类的代码,这类里有处理各种命令的方法,但我这里指贴主要的方法,其他的省略

public class ADBCommand {    private Runtime runtime;    private String device;    /**     * Default constructor, just get the runtime     */    public ADBCommand() {        runtime = Runtime.getRuntime();    }    /**     * Constructor with device initialization     *     * @param device attached device     */    public ADBCommand(String device) {        this();        this.device = device;    }    /**     * Set device     *     * @param device     */    public void setDevice(String device) {        this.device = device;    }    /**     * Execute a command in a shell     *     * @param command command to execute     * @return the return of the command     */    public String exec(String command) {        String retOur = "";        try {            Process p = runtime.exec("adb -s " + device + " shell " + command);            final InputStream is1 = p.getInputStream();            final InputStream is2 = p.getErrorStream();            new Thread() {                public void run() {                    BufferedReader standardIn = new BufferedReader(new InputStreamReader(is1));                    String line;                    try {                        while ((line = standardIn.readLine()) != null) {                            if (line != null) {                            }                        }                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }.start();            new Thread() {                public void run() {                    BufferedReader errorIn = new BufferedReader(new InputStreamReader(is2));                    String line;                    try {                        while ((line = errorIn.readLine()) != null) {                            if (line != null) {                            }                        }                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }.start();            p.waitFor();            p.destroy();            retOur = "执行成功";        } catch (IOException e) {            System.out.println(e.getMessage());        } catch (InterruptedException e) {            System.out.println(e.getMessage());        }        return retOur;    }    //省略部分代码……}

至此为止,所有功能要用到的代码就写完了。当我在页面点击“删除”按钮时,页面会以如下的命令执行DeletePad.bat文件:

D:/oa/DeletePad.bat 4df79c8167df4029

其中,4df79c8167df4029是我的Android设备号,是由js里的getDevice()函数得到的


之后,DeletePad.bat将会被启动,它将调用DataTranfer类的main方法,传入的参数是 2 和 4df79c8167df4029 这两个参数

再之后,DataTranfer类就会拼接成相应的删除命令并执行。最终,我Android设备中ZC文件夹下的所有.ini文件和ZC文件夹中upload文件夹中的所有文件都会被删除






更多相关文章

  1. Android(安卓)硬件抽象层(HAL)概要介绍和学习计划
  2. Android(安卓)studio简单使用JNI实例
  3. Android打包AAR及与unity通信方法
  4. Android学习总结
  5. Android(安卓)动态加载布局文件
  6. Windows下的Android(安卓)SDK下载,2.2之前各个版本及Google API,文
  7. android 应用程序包文件 (APK)
  8. 使用pull解析器操作xml文件
  9. NPM 和webpack 的基础使用

随机推荐

  1. TabHost 相关解决
  2. EditText的属性!
  3. android中的json二之json的读写
  4. Kotlin Android Extensions (译文)
  5. Android进程管理
  6. Android触摸屏中的手势识别
  7. Android中文API (109) —— SimpleCursor
  8. [置顶] Lua 学习教程之android与lua相互
  9. Android之——Fragment控制切换多个页面
  10. android的style控制Theme