方法1:【使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件】
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.IPackageInstallObserver;
import android.content.pm.IPackageDeleteObserver;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class InstallActivity extends Activity {
/** Called when the activity is first created. */
private String APK_NAME = "QQHD-mini.apk";
private Button install = null;
private Button uninstall = null;
private final int INSTALL_COMPLETE = 1;
private final int UNINSTALL_COMPLETE = 2;
final static int SUCCEEDED = 1;
final static int FAILED = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.install_uninstall);
install = (Button) findViewById(R.id.install);
uninstall = (Button) findViewById(R.id.uninstall);
uninstall.setOnClickListener(listener1);
install.setOnClickListener(listener2);
}
private OnClickListener listener2=new OnClickListener(){
public void onClick(View v) {
String fileName = Environment.getExternalStorageDirectory() + "/" + APK_NAME;
Uri uri = Uri.fromFile(new File(fileName));
int installFlags = 0;
PackageManager pm = getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo("com.tencent.minihd.qq",
PackageManager.GET_UNINSTALLED_PACKAGES);
if(pi != null) {
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
} catch (NameNotFoundException e) {}
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(uri, observer, installFlags, "com.tencent.minihd.qq");
}
};
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
msg.arg1 = returnCode;
mHandler.sendMessage(msg);
}
};
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case INSTALL_COMPLETE:
int centerTextLabel;
Drawable centerTextDrawable = null;
if(msg.arg1 == SUCCEEDED) {
Toast.makeText(getApplicationContext(), "install apk SUCCEEDED", Toast.LENGTH_SHORT).show();
} else {}
if (centerTextDrawable != null) {}
break;
case UNINSTALL_COMPLETE:
int centerTextLabel2;
Drawable centerTextDrawable2 = null;
if(msg.arg1 == SUCCEEDED) {
Toast.makeText(getApplicationContext(), "uninstall apk SUCCEEDED", Toast.LENGTH_SHORT).show();
} else {}
if (centerTextDrawable2 != null) {}
break;
default:
break;
}
}
};
private OnClickListener listener1=new OnClickListener(){
public void onClick(View v) {
PackageManager pm = getPackageManager();
PackageDeleteObserver observer = new PackageDeleteObserver();
pm.deletePackage("com.tencent.minihd.qq", observer, 0);
}
};
private class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
public void packageDeleted(String packageName, int returnCode) {
Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE);
msg.arg1 = returnCode;
mHandler.sendMessage(msg);
}
}
}
安装、卸载相关权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
方法2:【需要获取root权限或者和rom拥有一样的签名,即让该apk以System的身份在系统中运行】
private void test() {
execCommand("system/bin/pm install -r " + "sdcard/xxx.apk"); // xxx.apk放置在内置储存的根目录下(mnt/sdcard/xxx.apk)
// execCommand("system/bin/pm uninstall " + PACKAGE_NAME); //PACKAGE_NAME为xxx.apk包名
}
public boolean execCommand(String cmd) {
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
process.waitFor();
} catch (Exception e) {
return false;
} finally {
try {
process.destroy();
} catch (Exception e) {
}
}
return true;
}
其他方法:一些第三方jar包等方式
android 实现静默安装、卸载的更多相关文章
-
Android实现静默安装与卸载
一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方 ...
-
Android对于静默安装和卸载
在一般情况下,Android系统安装apk会有一个安装界面,用户可以单击确定或取消apk设备. 但在实际的项目需求中,有一种需求.就是希望apk在后台安装(不出现安装界面的提示),这样的安装方式称为静 ...
-
Android的静默安装
原文 Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安 ...
-
android 静默安装 卸载 资料汇总
1. android + eclipse + 后台静默安装(一看就会) 2. 适用于android1.5以下版本apk静默安装 3. error: INSTALL_FAILED_SHARED_USER ...
-
android apk静默安装
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢 ...
-
Android使用静默安装时碰见的问题
升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...
-
Android监听安装卸载
需要通过receiver来监听: 在AndroidManifest.xml文件中注册的receiver中必须加上<data android:scheme="package"/ ...
-
android实现静默安装demo
1.须要RootTools.jar 2.运行脚本 public class InstallerActivity extends Activity { /** Called when the a ...
-
Android随笔之——静默安装、卸载
随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐 ...
随机推荐
-
Banner中利用Jquery隐藏显示下方DIV块
实现方式1: <!DOCTYPE html><html><head> <meta charset="UTF-8"> &l ...
-
lintcode:线段树的查询
线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Segmen ...
-
jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)
首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...
-
setcookie 设置无效
转载请署名 achieverain,谢谢 经常见人问PHP程序无法设置cookie.下面把我遇见过的情况都说一遍 1 PHP程序在执行setcookie之前有输出. 解决 : 把setcooki ...
-
calling c++ from golang with swig--windows dll (四)
calling c++ from golang with swig--windows dll 四 前面讲述了windows环境下golang如何通过swig调用C++ dll.由于编译c++代码使用了 ...
- 前置通知也能对参数进行加工 通过joiPoint这个方法
-
C#红绿状态灯
1.在Label里 画圆,存在窗体刷新会丢失画. public void SetShowConnectStatus(Label lbl, bool isOk) { lbl.Text = "& ...
-
SVN版本管理系统的使用(CentOS+Subversion+Apache+Jsvnadmin+TortoiseSVN)
1.服务器: 192.168.4.221root 用 户操作安装 装 apache# yum install httpd httpd-devel# service httpd start# chkco ...
-
jmeter录制https请求
工具:Jmeter4.0 + Java1.8 需求:对某https网站进行 登录-修改信息-退出 场景的压力测试 方法:使用Apache JMeter HTTP(S) Test Script Reco ...
-
ireport 添加行自增序号
ireport 添加行自增序号 在ireport报表中加入行的自增序号方法: 添加一个变量,如变量名为 index: 设置变量类型为Integer,计算类型为count:变量表达式为$V{index} ...