Android静默安装和静默卸载代码
静默顾名思义就是静静的默默地,静默安装和静默卸载的意思也就是说在后台默默地安装和卸载。
最近的一个app应用分发的项目中app下载的模块,下载完成之后,用户可以通过这个app进行安装,为了提高用户的体验,我就加入了静默安装和卸载功能,然后还加入了使用am命令启动某个Activity。
这个项目中静默的方式实现代码如下:
首先判断是否有root权限,如果有利用静默方式,否则利用意图实现app安装和卸载操作。
package com.example.test; import java.io.File;
import java.io.IOException;
import java.io.PrintWriter; import android.content.Context;
import android.content.Intent;
import android.net.Uri; /**
* 描述: app安装操作
* @author 吴传龙
* Email:andywuchuanlong@sina.cn
* QQ: 3026862225
* @version 创建时间: 2015年3月6日 下午3:51:14
* @version 最后修改时间:2015年3月6日 下午3:51:14 修改人:吴传龙
*/
public class ApkController {
/**
* 描述: 安装
* 修改人: 吴传龙
* 最后修改时间:2015年3月8日 下午9:07:50
*/
public static boolean install(String apkPath,Context context){
// 先判断手机是否有root权限
if(hasRootPerssion()){
// 有root权限,利用静默安装实现
return clientInstall(apkPath);
}else{
// 没有root权限,利用意图进行安装
File file = new File(apkPath);
if(!file.exists())
return false;
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
context.startActivity(intent);
return true;
}
} /**
* 描述: 卸载
* 修改人: 吴传龙
* 最后修改时间:2015年3月8日 下午9:07:50
*/
public static boolean uninstall(String packageName,Context context){
if(hasRootPerssion()){
// 有root权限,利用静默卸载实现
return clientUninstall(packageName);
}else{
Uri packageURI = Uri.parse("package:" + packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,packageURI);
uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(uninstallIntent);
return true;
}
} /**
* 判断手机是否有root权限
*/
private static boolean hasRootPerssion(){
PrintWriter PrintWriter = null;
Process process = null;
try {
process = Runtime.getRuntime().exec("su");
PrintWriter = new PrintWriter(process.getOutputStream());
PrintWriter.flush();
PrintWriter.close();
int value = process.waitFor();
return returnResult(value);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(process!=null){
process.destroy();
}
}
return false;
} /**
* 静默安装
*/
private static boolean clientInstall(String apkPath){
PrintWriter PrintWriter = null;
Process process = null;
try {
process = Runtime.getRuntime().exec("su");
PrintWriter = new PrintWriter(process.getOutputStream());
PrintWriter.println("chmod 777 "+apkPath);
PrintWriter.println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");
PrintWriter.println("pm install -r "+apkPath);
// PrintWriter.println("exit");
PrintWriter.flush();
PrintWriter.close();
int value = process.waitFor();
return returnResult(value);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(process!=null){
process.destroy();
}
}
return false;
} /**
* 静默卸载
*/
private static boolean clientUninstall(String packageName){
PrintWriter PrintWriter = null;
Process process = null;
try {
process = Runtime.getRuntime().exec("su");
PrintWriter = new PrintWriter(process.getOutputStream());
PrintWriter.println("LD_LIBRARY_PATH=/vendor/lib:/system/lib ");
PrintWriter.println("pm uninstall "+packageName);
PrintWriter.flush();
PrintWriter.close();
int value = process.waitFor();
return returnResult(value);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(process!=null){
process.destroy();
}
}
return false;
} /**
* 启动app
* com.exmaple.client/.MainActivity
* com.exmaple.client/com.exmaple.client.MainActivity
*/
public static boolean startApp(String packageName,String activityName){
boolean isSuccess = false;
String cmd = "am start -n " + packageName + "/" + activityName + " \n";
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
int value = process.waitFor();
return returnResult(value);
} catch (Exception e) {
e.printStackTrace();
} finally{
if(process!=null){
process.destroy();
}
}
return isSuccess;
} private static boolean returnResult(int value){
// 代表成功
if (value == 0) {
return true;
} else if (value == 1) { // 失败
return false;
} else { // 未知情况
return false;
}
}
}
package com.example.test; import java.io.File; import android.support.v4.app.Fragment;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import android.os.Build;
/**
* 描述: MainActivity
* @author 吴传龙
* Email:andywuchuanlong@sina.cn
* QQ: 3026862225
* @version 创建时间: 2015年3月9日 上午8:19:19
* @version 最后修改时间:2015年3月9日 上午8:19:19 修改人:吴传龙
*/
public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
* 描述: 安装
* @param
* 修改人: 吴传龙
* 最后修改时间:2015年3月9日 上午8:19:30
*/
public void click1(View view){
new Thread(){
public void run() {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/jniTest.apk";
if (ApkController.install(path, getApplicationContext())){
toast("安裝成功");
}else{
toast("安裝失败");
}
};
}.start();
} /**
* 描述: 卸载
* @param
* 修改人: 吴传龙
* 最后修改时间:2015年3月9日 上午8:19:30
*/
public void click2(View view){
new Thread(){
public void run() {
if (ApkController.uninstall("com.example.jnitest", getApplicationContext())){
toast("卸載成功");
}else{
toast("卸載失败");
}
};
}.start();
} /**
* 描述: 启动
* @param
* 修改人: 吴传龙
* 最后修改时间:2015年3月9日 上午8:19:30
*/
public void click3(View view){
if (ApkController.startApp("com.example.jnitest","com.example.jnitest.MainActivity")) {
toast("啟動成功");
}
} public void toast(final String text){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();;
}
});
} }
要用其他的方式实现静默方式,可以通过伪装成系统应用,这就要给app打上系统应用的签名,但是这些签名在小米等手机上是没用的,所以这里不做介绍。还有就是通过把应用放在system/app的目录下也可以实现。
Android静默安装和静默卸载代码的更多相关文章
- Oracle的静默安装 升级和卸载 参考规范
Oracle的静默安装 升级和卸载 参考规范 20180912 V1 一.Oracle的安装 Oracle产品的三种安装方式分别为: 1.图形化(Java向导)安装引导 2.使用应答文件静默安装 3. ...
- CentOS 6.2 X64上64位Oracle11gR2 静默安装,静默设置监听,静默建库经验
1 安装前环境: 操作系统:CetnOS6.2x64 最小化安装,已配置好网络IP:172.16.2.182,物理内存8GB,硬盘100GB. 已下载: Linux.x64_11gR2_datab ...
- Android获取Root权限之后的静默安装实现代码示例分析
转:http://blog.csdn.net/jiankeufo/article/details/43795015 Adroid开发中,我们有时会遇到一些特殊功能的实现,有些功能并没有太高技术难度,但 ...
- Android采用pm命令静默卸载应用
卸载app的方式有多种,可以直接调用android系统的卸载程序,但是这样会调出android卸载提示框,问题就是真的不好看. 所以采用静默卸载的方式,避免弹出系统提示框. 方法一(调用系统卸载程序) ...
- sql server安装教程(2008 R2,图形界面安装/命令提示符安装即静默安装)
转自:http://blog.51cto.com/jimshu/585023 SQL Server 2008(32/64位)下载地址: 链接:https://pan.baidu.com/s/1eR5b ...
- SQL Server 静默安装
SQL Server 安装时,需要在各个安装窗口进行选择和设置,若需要在多台服务器安装相同的数据库,静默安装是比较省事的. 当安装 SQL Server 到最后一步,会有一个安装配置文件 Confi ...
- 静默安装Oracle12.2数据库
实验环境: 操作系统:Redhat 6.4 64位 数 据 库:Oracle 12c R2 一. 安装前准备 1. 创建用户和组 [root@wjq ~]# groupadd -g 1000 o ...
- KingbaseES 数据库静默安装
关键字:KingbaseES.V8R6.Silent.Java 一.环境准备 1.硬件环境支持 金仓数据库管理系统KingbaseES支持X86.X86_64,同时支持龙芯.飞腾等国产CPU硬件体系结 ...
- Android实现静默安装与卸载
一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方 ...
随机推荐
- 关于dp骗分
1.样例2.搜索3.大小->贪心:<1>每次选代价最小的两个矩阵 <2> 每次选最大.... ...
- BZOJ 4516: [Sdoi2016]生成魔咒 后缀自动机 性质
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 http://blog.csdn.net/doyouseeman/article/detail ...
- 基础知识(09) -- Spring 概述
Spring概述-------------------------------------------------------------------------主要内容: 1.Spring是什么 2 ...
- PAT甲级1026. Table Tennis
PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...
- SQl CASE 语句的嵌套使用方式
case具有两种格式.简单case函数和case搜索函数. 1.简单case函数 case sex when ’1’ then ’男’ when ’2’ then ’女’else ’其他’ end ...
- (转)Ext.Button点击事件的三种写法
转自:http://maidini.blog.163.com/blog/static/377627042008111061844345/ ExtJs的写法太灵活了,现在收集了关于Button点击事件的 ...
- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
- switch语句的基本使用
switch是一个多分支的选择语句. 1.基本格式: switch(整型表达式){ case 整型字面量: ...... default : } 解释: 1)整型字面量可 ...
- Android如何检查对象的类型
The instanceof operator compares an object to a specified type. You can use it to test if an object ...
- Git分支模型
转自:http://www.cnblogs.com/byeyear/archive/2012/11/28/2793374.html 本文介绍一种使用Git进行源代码管理的分支模型,着重于如何使用Git ...