http://www.apkbus.com/blog-33641-44366.html

最近在使用腾讯手机管家for Android的时候发现,通过USB连接品PC和手机,启动PC端腾讯手机管家,发现当手机端未安装腾讯手机精灵时会自动安装,如果已安装,会自动连接上。

研究了一下,发现原理其实很简单,只需要一行命令即可搞定,即依靠强大的adb命令之adb shell am start命令

  [adb shell am start]

·    -n <package_name>/.<activity_class_name>

作用:启动一个activity

  例如:

    adb shell am start -n  com.qq.AppService/com.qq.AppService.MainView

 

 通过启动腾讯手机精灵的主activity来检测手机端是否安装该应用,如果已经安装,则adb shell命令返回的结果:

   Starting: Intent { cmp=com.qq.AppService/.MainView }

 或者

   Starting: Intent { cmp=com.qq.AppService/.MainView }

   Warning: Activity not started, its current task has been brought to the front

 

如果未安装,则返回的结果是:

    Starting: Intent { cmp=com.qq.AppService/.MainView }

  Error type 3

  Error: Activity class {com.qq.AppService/com.qq.AppService.MainView} does not exist.

    

   通过解析执行adb命令之后返回的结果即可知道是否安装该应用。

    

              QQ手机精灵 http://www.apkbus.com/blog-33641-44366.html-编程知识网

                                 (PC端adb文件路径以及腾讯手机精灵apk包)

               注意:在PC端腾讯手机管家安装路径下也有上述四个文件,不同之处是adb.exe的名字是tadb.exe,

                   应该是腾讯处理adb模块代码编译出的可执行程序(因为tadb.exe文件有496k,也可能只改了个名字)

                   其实把腾讯手机管家安装路径下的tadb.exe名字改成adb.exe也是可以的

        

 

  代码:     

   /**   

     *   目前该函数适合于PC端检查手机端某一个应用是否安装或是否成功安装某一个应用    

     *

     * @param cmdString:adb shell 命令

     *        //adb.exe所在的路径,PC端需要有AdbWinApi.dll AdbWinUsbApi.dll adb.exe

     *        //PC端所有对adb shell命令的操作都需要上述三个文件

     *        String adbPath = "E://wts//adb ";   

     *            

     *        //检查腾讯手机精灵是否安装的命令

     *        // com.qq.AppService/com.qq.AppService.MainView 组件名,其中com.qq.AppService包名,MainViewactivity

              String cmdString = adbPath + "shell am start com.qq.AppService/com.qq.AppService.MainView";

     *

     *        //安装腾讯手机精灵的命令("E://wts//QQPhoneManager.apk"为手机精灵apk完整路径)

     *        String cmdString = adbPath +"install E://wts//QQPhoneManager.apk";

                 

     * @return  true:表示执行命令成功   

     *          false:执行失败

     *                                

     */

  publicstaticboolean execCommand(String cmdString) {

      

       boolean bFlag = true;

       Process process = null;

       if (cmdString != null && !"".equals(cmdString)) {

           try {

              process = Runtime.getRuntime().exec(cmdString);

              InputStream is = process.getInputStream();

              BufferedReader reader = new BufferedReader(

                     new InputStreamReader(is));

              String line;

              while ((line = reader.readLine()) != null) {

                  System.out.println(line);

                  if (line.contains("Error")) {

                     bFlag = false;

                     break;

                  }

                  //以下代码主要是判断使用adb install xxxx.apk 时是否成功

                  if (line.contains("Success")) {

                     bFlag = true;

                     break;

                  }

              }

              process.waitFor();

              is.close();

              reader.close();

              process.destroy();

           } catch (IOException e) {

              bFlag = false;

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              bFlag = false;

           }

       } else {

           bFlag = false;

       }

 

       return bFlag;

    }

 

 

    下面就可以直接根据该函数的返回值来判断是否安装某一个应用,如果未安装,然后直接安装,如果已经安装,直接启动。

 

     String adb_path = "E://wts//adb ";

          String strCmdString = adb_path + "shell am start -n  com.qq.AppService/com.qq.AppService.MainView";

     if (execCommand(strCmdString))

     {

                  System.out.println("已经安装腾讯手机精灵….");

         doSomething();

      }

      else {

                  System.out.println("没有安装腾讯手机精灵….");

         if(execCommand(adb_path + "install E://wts//QQPhoneManager.apk"))

         {

                        System.out.println("安装腾讯手机精灵成功….");

            doSomething();

         }

         else

         {

                        System.out.println("安装腾讯手机精灵失败…");

            doOtherthing();

         }

      }

 

    注意:实际上通过启动service或广播也可以实现检查手机端是否安装某个应用(实际上腾讯手机精灵就是通过adb命令启动service实现的,由于在实际研究测试中发现通过adb shell am startservice启动service成功,但是发现手机中并没有该service,应该是有权限设置吧),但不打算继续研究了,大家有兴趣可以在研究研究,呵呵。

     本文中直接通过启动activity中来实现检测是否安装某一个应用(需要已知组件名)。

 

     后面文章中会讲解

         1  PC端获取Android手机当前屏幕截图的方法(已完成)  

         2  PC端如何解析一个apk文件中得权限信息,icon图标信息等。

        这些都是PC端腾讯手机管家for Android,豌豆荚 91手机助手,apk安装器等常用到的一些功能,结合另一篇文章(

      实现pc端通过usb获取到android手机上的短信、通讯录等信息),你就可以开发出一个属于自己的PC端应用,实现管理手机端的短信、应用等);