先说一下实现逻辑,首先手机必须root权限,然后静默安装apk,在通过广播的形式启动安装的apk。
手机必须root权限 手机必须root权限 手机必须root权限 手机必须root权限
静默安装方法,返回值是0代表成功,1失败,其他不知
方法一:
//cmd =apk存储路径
protected int excuteSuCMD(String cmd) {
PrintWriter PrintWriter = null;
Process process = null;
try {
process = Runtime.getRuntime().exec("su");
PrintWriter = new PrintWriter(process.getOutputStream());
PrintWriter.println("chmod 777 " + cmd);
PrintWriter
.println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");
PrintWriter.println("pm install -r " + cmd);
// PrintWriter.println("exit");
PrintWriter.flush();
PrintWriter.close();
int value = process.waitFor();
Log.e("File.toString()====value=静默安装返回值===", "" + value);
return (Integer)value;
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
if (process != null) {
process.destroy();
}
}
}
方法二:
//cmd ="pm install -r "+apk存储路径
protected int excuteSuCMD(String cmd) {
try {
//手机必须root
Process process = Runtime.getRuntime().exec("su");// (这里执行是系统已经开放了root权限,而不是说通过执行这句来获得root权限)
DataOutputStream dos = new DataOutputStream(
(OutputStream) process.getOutputStream());
// 部分手机Root之后Library path 丢失,导入path可解决该问题
dos.writeBytes((String) "export LD_LIBRARY_PATH=/vendor/lib:/system/lib\n");
cmd = String.valueOf(cmd);
dos.writeBytes((String) (cmd + "\n"));
dos.flush();
dos.writeBytes("exit\n");
dos.flush();
process.waitFor();
int result = process.exitValue();
System.out.println("静默安装命令1:" + result);
return (Integer) result;
} catch (Exception localException) {
localException.printStackTrace();
return -1;
}
}
静默安装成功之后,当前程序会自动退出,如果需要在自启动,必须借助广播。
注意:小编在这遇到一个问题,静默安装要都是debug版本,或者release版本,不能混淆
广播通知:
在androidManifest.xml中注册广播
<receiver android:name=".UpdateReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package"/>
</intent-filter>
</receiver>
public class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){
Toast.makeText(context,"升级了一个安装包,重新启动此程序", Toast.LENGTH_SHORT).show();
Intent intent2 = new Intent(context, SplashActivity.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
}
//接收安装广播
if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {
String packageName = intent.getDataString();
System.out.println("安装了:" +packageName + "包名的程序");
}
//接收卸载广播
if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
String packageName = intent.getDataString();
System.out.println("卸载了:" + packageName + "包名的程序");
}
}
}
注:PACKAGE_REPLACED—-替换apk
PACKAGE_ADDED—添加apk
PACKAGE_REMOVED–删除apk
一般添加,删除apk中,广播基本不会实现
参考文章为:http://blog.csdn.net/qq_29716061/article/details/51602173
http://blog.csdn.net/wan_ing/article/details/53407748