在一般情况下,Android系统安装apk会有一个安装界面,用户可以单击确定或取消apk设备。

但在实际的项目需求中,有一种需求。就是希望apk在后台安装(不出现安装界面的提示),这样的安装方式称为静默安装。

Android实现静默安装的方式有非常多,这里仅仅介绍一种比較简单易理解的方法,就是调用Android未公开的API(installPackage)来实现。

以下通过一种简单的Demo来简单实现静默安装。界面例如以下:

当点击"静默安装"的button时。会在后台安装360手机卫士的apk。成功安装后,会弹出Toast提示成功安装。

首先须要再AndroidManifest.xml声明以下的权限:

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

然后主要实现的代码例如以下:

从上面能够看出。事先须要再SD卡上放一个须要静默安装的apk(没有检測这个apk是否存在,仅仅是简单实现)

上面的方法中涉及到了PackageInstallObserver类。实现代码例如以下:

代码部分已经基本实现完毕。可是在eclipse里面,这个Demo是编译只是的,由于installPackage这个API没有公开,在上层是调用不到的,所以,须要在Android源代码的环境下编译。在Demo根文件夹下新建Android.mk文件,内容例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpbmVmbG93ZXJz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

Android.mk的写法有固定的格式和写法。假设不会写,能够參考Android源代码中个系统应用mk文件的写法。

以下简介下mk几个选项的含义:

以下的头和尾的写法都是固定的:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

......

LOCAL_SRC_FILES := $(call all-subdir-java-files)

......

include $(BUILD_PACKAGE)

LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块仅仅在user版本号下才编译
eng: 指该模块仅仅在eng版本号下才编译
tests: 指该模块仅仅在tests版本号下才编译


optional:指该模块在全部版本号下都编译
LOCAL_PACKAGE_NAME   须要编译项目的名称
假设你的APK依赖第三方jar包,还能够通过以下的选项来定义
LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j
Android.mk的洗发和规范有非常多,详细能够在网上查查资料。

准备就绪后。就能够在Android源代码环境下通过mmm编译这个Demo了,当然源代码的编译环境须要自己配置。

另外,静默卸载也能够通过这样的方式实现,与installPackage相应的还有个deletePackage的API,使用方法跟上面是一样的。

依照上面方法,有的人可能会出现以下的这个错误:

java.lang.SecurityException: Neither user 10034 nor current process has android.permission.INSTALL_PACKAGES.

这是由于仅仅有系统应用才有android.permission.INSTALL_PACKAGES这个权限。出现这个问题的解决办法是,没有将自己的应用放在Android源代码packages/app文件夹下就直接进行模块编译,这样编译出来的APK不是系统应用,没有系统的权限。解决问题有两种方法:

1. 将自己的应用放在packages/app文件夹下再进行模块编译

2. 直接安装out/target/product/generic/obj/APPS/应用名_intermediates/Package.apk.unaligned这个APK,就不会有这个问题。

版权声明:本文博主原创文章。博客,未经同意不得转载。

Android对于静默安装和卸载的更多相关文章

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

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

  2. android 实现静默安装、卸载

    方法1:[使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件] import java.io.File ...

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

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

  4. Android的静默安装

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

  5. Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)

    一.通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 . (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/ ...

  6. Android_实现静默安装和卸载应用

    转:http://www.cnblogs.com/ondream/archive/2012/04/13/2446138.html 前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部 ...

  7. android apk静默安装

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

  8. innosetup的静默安装与卸载

    静默安装,就是减少程序与用户的交互,一站式的安装过程(一气呵成) 1. 静默安装参数 innosetup的静默安装是通过参数来控制的 1.1.  /silent                     ...

  9. android程序的安装与卸载

    Android android在安装应用程序与卸载应用程序时都会发送广播,安装应用程序成功时会发送android.intent.action.PACKAGE_ADDED广播,可以通过intent.ge ...

随机推荐

  1. Windows Phone开发(12):认识一下独具个性的磁贴

    原文:Windows Phone开发(12):认识一下独具个性的磁贴 对"磁贴"的理解是一点也不抽象的,为什么呢?只要你愿意启动WP系统,无论你是在模拟器中还是在真机中,是的,桌面 ...

  2. 【shell文字】mysql每日备份shell文字

    每天固定时间使用mysqldump 备份mysql数据. #!/bin/bash #每天早上4点, mysql备份数据 orangleliu #chmod 700 backup.sh #crontab ...

  3. .net机试题总结

    1.下面是一个由*号组成的4行倒三角形图案.要求:1.输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”:2.在屏幕上打印这个指定了行数的倒三角形. ******* ...

  4. Blend4精选案例图解教程(三):一键拖拽

    原文:Blend4精选案例图解教程(三):一键拖拽 拖拽效果,常规实现方法是定义MoveLeftDwon.MoveLeftUp.MouseMove事件,在Blend的世界里,实现对象的拖拽,可以不写一 ...

  5. Android 开发环境搭建之——ADT-Bundle for Windows

    ADT-Bundle for Windows 是由Google Android官方提供的集成式IDE,已经包含了Eclipse,你无需再去下载Eclipse,并且里面已集成了插件,它解决了大部分新手通 ...

  6. 无阻塞情况connect生产EINPROGRESS错

    今天的游戏开发client测试程序,非常多,因为出现client.后connect成功.代码证recv系统调用.后来发现,可能是由于socket默认模式被阻止,这将使很多client 接处于链接却不能 ...

  7. JFrame、JDialog close

    package common; import javax.swing.JFrame; import javax.swing.SwingUtilities; /*2015-5-26*/ public c ...

  8. 交换A与B值的四种方法

    在网上看到了这样一道面试题,"int A=5,int B=2,怎样交换A与B的值",或许这是一道简单到不能再简单的题,但能作为一道面试题,肯定有其独特之处 大多数人会通过定义第三个 ...

  9. cocos2d-html5

    cocos2d-html5 简单的混乱 在正常情况下,build设置完毕后 跑ant编 变更后cocos2d.js 简单直观so easy 只需要上传cocos2d.js/game.js/index文 ...

  10. docker 现实---联网多台物理主机,容器桥到物理网络(三)

    docker 默认桥接卡docker0 只有当这个单元中的所有容器桥接卡.例如,在主机虚拟网络适配器容器看通常称为veth***  和docker只要把这些卡桥接在一起,例如下面的附图: waterm ...