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命令之后返回的结果即可知道是否安装该应用。
(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包名,MainView主activity
String cmdString = adbPath + "shell am start -n 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端应用,实现管理手机端的短信、应用等);