本文主要介绍程序如何安装apk,包括普通模式安装和系统权限静默安装。
如果是非系统应用请直接查看:Android常用代码之APK root权限静默安装,查看更完美的解决方案。
1、普通模式安装,调用系统Intent,代码如下:
| 1 2 3 4 5 6 | public static void install(Context context, String filePath) { 	Intent i = new Intent(Intent.ACTION_VIEW); 	i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); 	i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 	context.startActivity(i); } | 
2、静默安装
如果是非系统应用请移步:Android常用代码之APK root权限静默安装,查看更完美的解决方案。
分为如下三步
(1)、静默安装需要系统应用安装权限,需要在AndroidManifest.xml中添加
| 1 | <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> | 
(2)、实现代码
静默安装代码如下,实际是通过pm install -r 命令安装。
注意:该函数最好在新建的线程中运行并通过handler发送安装结果给主线程,否则安装时间较长会导致ANR。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /**  * install slient  *   * @param context  * @param filePath  * @return 0 means normal, 1 means file not exist, 2 means other exception error  */ public static int installSlient(Context context, String filePath) { 	File file = new File(filePath); 	if (filePath == null || filePath.length() == 0 || (file = new File(filePath)) == null || file.length() <= 0 		|| !file.exists() || !file.isFile()) { 		return 1; 	} 	String[] args = { "pm", "install", "-r", filePath }; 	ProcessBuilder processBuilder = new ProcessBuilder(args); 	Process process = null; 	BufferedReader successResult = null; 	BufferedReader errorResult = null; 	StringBuilder successMsg = new StringBuilder(); 	StringBuilder errorMsg = new StringBuilder(); 	int result; 	try { 		process = processBuilder.start(); 		successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); 		errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); 		String s; 		while ((s = successResult.readLine()) != null) { 			successMsg.append(s); 		} 		while ((s = errorResult.readLine()) != null) { 			errorMsg.append(s); 		} 	} catch (IOException e) { 		e.printStackTrace(); 		result = 2; 	} catch (Exception e) { 		e.printStackTrace(); 		result = 2; 	} finally { 		try { 			if (successResult != null) { 				successResult.close(); 			} 			if (errorResult != null) { 				errorResult.close(); 			} 		} catch (IOException e) { 			e.printStackTrace(); 		} 		if (process != null) { 			process.destroy(); 		} 	} 	// TODO should add memory is not enough here 	if (successMsg.toString().contains("Success") || successMsg.toString().contains("success")) { 		result = 0; 	} else { 		result = 2; 	} 	Log.d("installSlient", "successMsg:" + successMsg + ", ErrorMsg:" + errorMsg); 	return result; } | 
返回值0表示安装成功,1表示文件不存在,2表示其他错误。需要更丰富的安装失败信息(内存不足、解析包出错)可直接使用PackageUtils.installSlient。
(3) 、获取系统权限
完成了上面两步后,普通方式安装我们的应用仍然无法静默安装。需要我们的应用获得系统权限,编译应用并通过
adb push <your_apk_path> /system/app/
命令实现安装,即可拥有系统权限。
android P 有没有试过 androidP上静默安装失败