android 4.0.4系统下实现apk的静默安装和启动
来源:互联网 发布:淘宝送一个月优酷会员 编辑:程序博客网 时间:2024/06/05 23:58
最近在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
0 0
- android 4.0.4系统下实现apk的静默安装和启动
- android 4.0.4系统下实现apk的静默安装和启动
- android 4.0.4系统下实现apk的静默安装和启动
- Android 4.0.4系统下实现apk的静默安装和启动
- ***android 4.0.4系统下实现apk的静默安装和启动
- android 4.0.4系统下实现apk的静默安装和启动
- Android 4.0.4系统下实现apk的静默安装和启动
- Android下实现静默安装指定APK
- Android 实现Apk的后台静默安装
- Android系统静默安装APK
- 静默安装apk的实现
- Android—java实现apk的静默安装、普通安装
- [Android]实现静默安装APK的两种方法
- [Android]实现静默安装APK的两种方法
- [Android]实现静默安装APK的两种方法
- [Android]实现静默安装APK的两种方法
- [Android]实现静默安装APK的两种方法
- [Android]实现静默安装APK的两种方法
- poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图
- J2EE之初识JSP
- [亲测] 解决在 ubuntu14.04 安装完 vmware 后,启动出现下列问题的解决方案
- DataSet.Tables[0].Rows[0][1]的含义
- cocos2d-x环境搭建
- android 4.0.4系统下实现apk的静默安装和启动
- 理论知识整理(C语言)
- 解决ultravnc在win2008 R2下CTRL+ALT+DELETEA组合键发送失败的问题
- C语言输出螺旋矩阵
- seajs 2.3.0 傻瓜式入门
- poj 3348 Cows 凸包模板题
- Linux ARM交叉编译器设定
- vs自动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法
- 指针