apk 静默安装
如果需要应用进行静默安装,则需要满足一下两个条件
1 必须添加权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
2 必须是系统应用,或者系统签名应用
方法 1 通过 adb install 安装
/**
*
* @param apkFilePath 安装包路径
* @return true 、false
*/
public boolean installByADB(String apkFilePath){
boolean success = false;
if (apkFilePath == null || apkFilePath.equals("")) {return success;}
File apkFile = new File(apkFilePath);
if (!apkFile.exists() || apkFile.isDirectory()) {return success;}
String[] args = { "pm", "install", "-r", "-d", apkFilePath };
ByteArrayOutputStream eBAout = new ByteArrayOutputStream();
ByteArrayOutputStream nBAout = new ByteArrayOutputStream();
ProcessBuilder processBuilder = null;
java.lang.Process process = null;
InputStream eis = null;
InputStream is = null;
int num = 0;
byte[] buffer = new byte[1024];
try {
processBuilder = new ProcessBuilder(args);
process = processBuilder.start();
eis = process.getErrorStream();
while ((num = eis.read(buffer)) != -1) {
eBAout.write(buffer, 0, num);
}
is = process.getInputStream();
while ((num = is.read(buffer)) != -1) {
nBAout.write(buffer, 0, num);
}
String error = eBAout.toString("UTF-8");
String normal = nBAout.toString("UTF-8");
if(normal != null && normal.contains("Success")){success = true;}
} catch (IOException e) {
} catch (Exception e) {
} catch (Throwable t) {
} finally {
try {
if (null != eis) {eis.close();}
} catch (Exception e) {}
try {
if (null != is) {is.close();}
} catch (Exception e) {}
process.destroy();
}
return success;
}
方法2 通过PM安装
这个方法的前提是将framework参与编译并排列第一
/**
* @param context
* @param apkPath
*/
public void installSilentlyBYPM(Context context, String apkPath) {
if(apkPath == null || "".equals(apkPath)){return;}
File apkFile = new File(apkPath);
(!apkFile.exists() || apkFile.isDirectory()){return;}
Uri apkPackageURI = Uri.fromFile(apkFile);
int installFlags = PackageManager.INSTALL_ALL_USERS|PackageManager.INSTALL_REPLACE_EXISTING;
PackageManager pm = context.getPackageManager();
pm.installPackage(apkPackageURI, new PackageInstallObserver(){
@Override
public void onPackageInstalled(String basePackageName, int returnCode, String msg, Bundle extras){
super.onPackageInstalled(basePackageName, returnCode, msg, extras);
if(returnCode == 1){
//如果安装包的包名等于basePackageName; 则安装成功
}
}
}, installFlags, context.getPackageName());
}