方法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 实现静默安装、卸载的更多相关文章

  1. Android实现静默安装与卸载

    一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方 ...

  2. Android对于静默安装和卸载

    在一般情况下,Android系统安装apk会有一个安装界面,用户可以单击确定或取消apk设备. 但在实际的项目需求中,有一种需求.就是希望apk在后台安装(不出现安装界面的提示),这样的安装方式称为静 ...

  3. Android的静默安装

    原文 Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安 ...

  4. android 静默安装 卸载 资料汇总

    1. android + eclipse + 后台静默安装(一看就会) 2. 适用于android1.5以下版本apk静默安装 3. error: INSTALL_FAILED_SHARED_USER ...

  5. android apk静默安装

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢 ...

  6. Android使用静默安装时碰见的问题

    升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...

  7. Android监听安装卸载

    需要通过receiver来监听: 在AndroidManifest.xml文件中注册的receiver中必须加上<data android:scheme="package"/ ...

  8. android实现静默安装demo

    1.须要RootTools.jar 2.运行脚本 public class InstallerActivity extends Activity {     /** Called when the a ...

  9. Android随笔之——静默安装、卸载

    随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐 ...

随机推荐

  1. IOS 排序算法

    /** * @brief 冒泡排序法 * * @param arr 需要排序的数组 */ -(void)BubbleSort:(NSMutableArray *)arr { // 取第一个与其邻接的对 ...

  2. HINTERNET 句柄

    这篇文章的内容能够简单总结例如以下: WinINet函数创建和使用类型为HINTERNET的句柄 HINTERNET句柄不能与其它类型的句柄互换使用 用InternetCloseHandle关闭HIN ...

  3. C程序设计语言(K&R)笔记

    1.表达式中float类型的操作数不会自动转换为double类型.一般来说,数学函数(如math.h)使用双精度类型的变量.使用float类型主要是为了在使用较大数组时节省存储空间,有时也为了节省机器 ...

  4. CentOS6.5下解压文件.tar.gz .war .zip

    解压.tar.gz文件: tar -zxvf web.tar.gz tar不支付解压文件到指定的文件夹! 解压.war .zip文件到指定文件夹: unzip web.war -d webapps/R ...

  5. ADB命令解析

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(手机). 它的主要功能有: * ...

  6. python 基础篇(二)数据类型概述

    正式进入python的学习. 数据类型可以分为身份,类型,数据项三项联合组成. 身份: id() 类型:type() 数据类型:int,boolean,tuple,string,dict,list 1 ...

  7. 注册宝第五期beta2插件模块下载及说明

    原文:http://bbs.84zcb.com/showtopic-1882.aspx [软件名称]:注册宝插件模块 [软件版本]:V1.4 [软件大小]:6.36M [软件语言]:简体中文 [授权方 ...

  8. java 简单的文件上传

    一.文件上传原理: 1.文件上传的前提: a.form表单的method必须是post b.form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的 ...

  9. [转]Linux netstat命令详解

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...

  10. Delphi与字符编码(实战篇)(MultiByteToWideChar会返回转换后的宽字符串长度)

    本文目标: 了解Delphi的字符串类型 字符编码的检测与转换 简体繁体转换 0. 导言 看完“.Net与字符编码(理论篇)”,我们明白了字符是自然语言中的最小单位,在存储和传输的过程中可以使用三种编 ...