android 4.0.4系统下实现apk的静默安装和启动
最近在android 4.0.4系统下实现apk的静默安装和启动的功能,这里和大家分享一下,希望能有所帮助。
源码如下:
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.List;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.ActivityInfo;
- import android.content.pm.PackageInfo;
- import android.content.pm.PackageManager;
- import android.content.pm.ResolveInfo;
- public class InstallApkUtils {
- public static void installAndStartApk(final Context context, final String apkPath) {
- if ((apkPath==null) || (context==null)) {
- return;
- }
- File file = new File(apkPath);
- if (file.exists() == false) {
- return;
- }
- new Thread() {
- public void run() {
- String packageName = getUninstallApkPackageName(context, apkPath);
- if (silentInstall(apkPath)) {
- List<ResolveInfo> matches = findActivitiesForPackage(context, packageName);
- if ((matches!=null) && (matches.size()>0)) {
- ResolveInfo resolveInfo = matches.get(0);
- ActivityInfo activityInfo = resolveInfo.activityInfo;
- startApk(activityInfo.packageName, activityInfo.name);
- }
- }
- };
- }.start();
- }
- public static String getUninstallApkPackageName(Context context, String apkPath) {
- String packageName = null;
- if (apkPath == null) {
- return packageName;
- }
- PackageManager pm = context.getPackageManager();
- PackageInfo info = pm.getPackageArchiveInfo(apkPath,
- PackageManager.GET_ACTIVITIES);
- if (info == null) {
- return packageName;
- }
- packageName = info.packageName;
- return packageName;
- }
- public static List<ResolveInfo> findActivitiesForPackage(Context context, String packageName) {
- final PackageManager pm = context.getPackageManager();
- final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- mainIntent.setPackage(packageName);
- final List<ResolveInfo> apps = pm.queryIntentActivities(mainIntent, 0);
- return apps != null ? apps : new ArrayList<ResolveInfo>();
- }
- public static boolean silentInstall(String apkPath) {
- String cmd1 = "chmod 777 " + apkPath + " \n";
- String cmd2 = "LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r " + apkPath + " \n";
- return execWithSID(cmd1, cmd2);
- }
- private static boolean execWithSID(String... args) {
- boolean isSuccess = false;
- Process process = null;
- OutputStream out = null;
- try {
- process = Runtime.getRuntime().exec("su");
- out = process.getOutputStream();
- DataOutputStream dataOutputStream = new DataOutputStream(out);
- for (String tmp : args) {
- dataOutputStream.writeBytes(tmp);
- }
- dataOutputStream.flush(); // 提交命令
- dataOutputStream.close(); // 关闭流操作
- out.close();
- isSuccess = waitForProcess(process);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return isSuccess;
- }
- public static boolean startApk(String packageName, String activityName) {
- boolean isSuccess = false;
- String cmd = "am start -n " + packageName + "/" + activityName + " \n";
- try {
- Process process = Runtime.getRuntime().exec(cmd);
- isSuccess = waitForProcess(process);
- } catch (IOException e) {
- NLog.i(TAG, e.getMessage());
- e.printStackTrace();
- }
- return isSuccess;
- }
- private static boolean waitForProcess(Process p) {
- boolean isSuccess = false;
- int returnCode;
- try {
- returnCode = p.waitFor();
- switch (returnCode) {
- case 0:
- isSuccess = true;
- break;
- case 1:
- break;
- default:
- break;
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return isSuccess;
- }
- }
如果要使用,还需以下步骤:
1、在AndroidManifest.xml文件里添加如下权限:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
2、进行系统签名。命令如下:
java -jar signapk.jar platform.x509.pem platform.pk8 XXX.apk Signed_XXX.apk
备注:一般可在源码的目录\out\host\linux-x86\framework\下找到signapk.jar,在\build\target\product\security下找到签名文件platform.x509.pem和platform.pk8。
好了,现在大功告成!!!
android 4.0.4系统下实现apk的静默安装和启动的更多相关文章
- aix系统下的websphere的静默安装
一:环境 aix5.3,websphere6(ND版本,WebSphereV6.1_for_AIX_64-bit_Support.tar),注意:aix和websphere的版本问题 二:安装 ...
- Linux 系统下用源码包安装软件
Linux系统下用源码包安装软件 by:授客 QQ:1033553122 下载源码安装包,解压或者直接双击打开(如果有安装zip或rar等压缩/解压缩软件的话),查找相关的安装说明文件,一般是READ ...
- Linux下如何查看tomcat是否安装、启动、文件路径、进程ID
Linux下如何查看tomcat是否安装.启动.文件路径.进程ID 在Linux系统下,Tomcat使用命令的操作! 检测是否有安装了Tomcat: rpm -qa|grep tomcat 查看Tom ...
- Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException
一.写在前面 最近由于廖子尧忙于自己公司的事情和OkGo(一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护ImagePicker(一款支持单.多选.旋转和裁剪的图片选择器),也是处理了诸多 ...
- 【适配整理】Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException
一.写在前面 最近由于廖子尧忙于自己公司的事情和 OkGo (一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护 ImagePicker(一款支持单.多选.旋转和裁剪的图片选择器),也是处理 ...
- 【转】android 5.0 64bit系统加载库文件失败问题浅析
原文网址:http://blog.csdn.net/andrewblog/article/details/43601303 最近公司的一个项目使用android 5.0 64 bit平台,相对以前版本 ...
- Android 5.0以下系统支持TLS 1.1/1.2协议版本
一.背景 项目中,客户端与服务端之间普遍使用Https协议通信,突然接到测试同事反馈Android5.0以下手机上,App测试服使用出现问题,出现SSL handshake aborted错误信息,但 ...
- 关于 Android 5.0 原生系统网络图标上的感叹号问题解决方法
解决方案 adb shell settings put global captive_portal_server g.cn 参考 关于 android 5.0 网络图标上的感叹号及其解决办法
- Linux系统下Apache2.4.17的安装过程
Linux系统下安装Apache Server2.4.17.还是先声明一下,Linux命令我不进行讲解,因为我不是讲Linux命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...
随机推荐
- 《锋利的jQuery》读书笔记(DOM+事件)
前阵子买了一批书,就从锋利的jQuery看起吧,书中一些太过常规以及没有强记必要性的操作就不记录了. 1.DOM加载后执行JS $(document).ready(function(){ //.... ...
- 你必须知道的495个C语言问题,学习体会三
本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住 ...
- opencv 卡尔曼滤波器例子,自己修改过
一.卡尔曼滤波器的理论解释 http://blog.csdn.net/lindazhou2005/article/details/1534234(推荐) 二.代码中一些随机数设置函数,在opencv中 ...
- display:box属性
在移动端开发的时候,圣杯布局,弹性盒,是我们经常会用得到的,W3C很久以前就有一个display:box属性 flex是最新的,但是在实际的浏览器测试中,display: flex 不能完全替代dis ...
- HihoCoder - 1615矩阵游戏II(贪心)
矩阵游戏II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxN的整数矩阵,小Hi每次操作可以选择两列,将这两列中的所有数变成它的相反数. 小Hi可以进行任意 ...
- BigDecimal的用法
一.简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- python学习-实现用户密码登录,输错三次锁定
作业需求: 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 实现思路: 判断用户是否在黑名单,若在黑名单,则将用户锁定 判断用户是否存在,若不存在,提示用户不存在 若用户存在,判断登录密码是否 ...
- Bean后置处理器 BeanPostProcessor
1.BeanPostProcessor接口的作用 Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理,Bean后置处理器对IOC容器的所有bean实例逐一处理,而非单一实例. 我们可以 ...
- 一个苹果证书如何多次使用——导出p12文件[多台电脑使用]
为什么要导出.p12文件 当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了(一般在我们的证书界面中 ...
- 插入排序的JavaScript实现
思想 每次在现有已经排好的数组的基础上排入一个新的数组项. 先把第一项看做是已经排好的,第二项应该排在第一项之前还是之后呢?当前两项排好后,第三项应该排在这已排好的两项的之前还是之后还是中间呢?当前三 ...