04/24
2013

Android常用代码之普通及系统权限静默安装APK

本文主要介绍程序如何安装apk,包括普通模式安装和系统权限静默安装。

如果是非系统应用请直接查看:Android常用代码之APK root权限静默安装,查看更完美的解决方案。

 

1、普通模式安装,调用系统Intent,代码如下:

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中添加

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

 

(2)、实现代码
静默安装代码如下,实际是通过pm install -r 命令安装。
注意:该函数最好在新建的线程中运行并通过handler发送安装结果给主线程,否则安装时间较长会导致ANR。

/**
 * 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/
命令实现安装,即可拥有系统权限。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

51 thoughts on “Android常用代码之普通及系统权限静默安装APK