android 实现静默安装、卸载
来源:互联网 发布:华为网络解决方案部 编辑:程序博客网 时间:2024/05/22 12:54
android中应用的安装卸载,大家(用android设备的)肯定不陌生。这里就来浅谈android应用的安装、卸载的实现方式。
1.系统安装程序
android自带了一个安装程序---/system/app/PackageInstaller.apk.大多数情况下,我们手机上安装应用都是通过这个apk来安装的。代码使用也非常简单:
通过发一个Intent,把应用所在的路径封装整uri.之后默认启动了PackageInstaller.apk来安装程序了。
但是此种情况下,仅仅是个demo而已,很难达到开发者的需求。如:
界面不好
什么时候安装完了,卸载完了呢?
为了达到自己的需求,相信很多人都会接着来监听系统安装卸载的广播,继续接下来的代码逻辑。
2.监听系统发出的安装广播
在安装和卸载完后,android系统会发一个广播
android.intent.action.PACKAGE_ADDED(安装)
android.intent.action.PACKAGE_REMOVED(卸载)
咱们就监听这广播,来做响应的逻辑处理。实现代码:
AndroidMenifast.xml里配置:
到此,确实安装卸载的整体流程都知道了,但是这个效果肯定是无法达到项目的需求。
一般这种应用商店类的项目,肯定是会要自定义提示框效果的安装卸载功能,而不是调用系统的安装程序。
那咱就要想法子实现静默安装、卸载咯。
网上有很多法子,如执行adb install 或pm install -r命令安装。但我想这并不可靠。记得之前有做过一个应用来执行linux命令,是通过RunTime来执行命令的。
后来发现其实并不靠谱,还不如直接用C代码来实现。
下面这种调用系统隐藏api接口来实现静默安装卸载,是比较大众靠谱的,实现自定义的提示界面。O(∩_∩)O~
3.系统隐藏的api
隐藏api,顾名思义,普通情况下肯定是调用不到的。翻翻源码\frameworks\base\core\java\android\content\pm目录下PackageManager.java,应该发现
在注释行里有加上@hide声明。调用的安装下载接口如下:
并且都是抽象方法,需要咱们实现。
看参数里IPackageInstallObserver observer一个aidl回调通知接口,当前目录中找到这接口:
好吧,这里有现成的干货,咱拿过来直接用呗(当然如果没有源码的那就算了,那能实现的只是demo)。具体步骤:
从源码中拷贝要使用的aidl回调接口:IPackageInstallObserver.aidl、IPackageDeleteObserver.aidl当然完全可以拷贝整个pm目录,这样就不会报错了O(∩_∩)O~。
作者项目里面用到了pm,所以把PackageManager.java以及涉及到的一些文件也拷贝过来了,不然eclipse报找不到PackageManager对象。结构如下:
(注:此处的包名android.content.pm一定要和源码目录结构一致,不然源码里编译会提示找不到aidl接口。一切朝源码编译看齐)
此处有2种方式实现:
1.直接只取IPackageDeleteObserver.aidl和IPackagerInstallObserver.aidl、IPackageMoveObserver.aidl等要使用的接口,然后通过bindService来和系统连接服务,然后直接调用接口即可(这种没有方式作者没试过,不过原理上来说应该是可行的,除非系统没有这个Service实现这个接口。有需求的可以深究下)
2.作者此处的方法是直接拷贝了源码PackageManager.java等文件过来,不过靠过来之后eclipse会提示一些接口错误,但这里作者把上面那几个.java文件都放空了,因为用不到,只是为了编译过才拷贝了那么多文件。最简单的就是直接拷贝4个文件即可:
PackageManager.java
IPackageDeleteObserver.aidl
IPackagerInstallObserver.aidl
IPackageMoveObserver.aidl
然后把PackageManager.java中报的异常的接口都注释掉即可
实现回调接口,代码如下
?123456789101112131415161718192021222324252627class MyPakcageInstallObserver extends IPackageInstallObserver.Stub {Context cxt;String appName;String filename;String pkname;public MyPakcageInstallObserver(Context c, String appName,String filename,String packagename) {this.cxt = c;this.appName = appName;this.filename = filename;this.pkname = packagename;}@Overridepublic void packageInstalled(String packageName, int returnCode) {Log.i(TAG, "returnCode = " + returnCode);// 返回1代表安装成功if (returnCode == 1) {//TODO}Intent it = new Intent();it.setAction(CustomAction.INSTALL_ACTION);it.putExtra("install_returnCode", returnCode);it.putExtra("install_packageName", packageName);it.putExtra("install_appName", appName); cxt.sendBroadcast(it);}}卸载回调接口同上。
调用PackageManager.java隐藏方法,代码如下:
?1234567891011121314151617181920212223242526/*** 静默安装* */public static void autoInstallApk(Context context, String fileName,String packageName, String APPName) {Log.d(TAG, "jing mo an zhuang:" + packageName + ",fileName:" + fileName);File file = new File(fileName);int installFlags = 0;if (!file.exists())return;installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;if (hasSdcard()) {installFlags |= PackageManager.INSTALL_EXTERNAL;}PackageManager pm = context.getPackageManager();try {IPackageInstallObserver observer = new MyPakcageInstallObserver(context, APPName, appId, fileName,packageName,type_name);Log.i(TAG, "########installFlags:" + installFlags+"packagename:"+packageName);pm.installPackage(Uri.fromFile(file), observer, installFlags,packageName);} catch (Exception e) {}}卸载调用同上
很多码友联系,这里经常出错,现整理参考代码如下(下面代码有些格式问题):
自此,静默安装卸载代码实现。最后在AndroidMenifast.xml中要注册权限和添加为系统用户组,如果eclipse编译的话,并记得签名(不会的话戳这里):
注:最后特别注意一点,因为下载的apk等只有rw----- root可读写权限,必须用个办法来给下载的apk赋权限,让系统级应用可以打开操作。这里作者是通过一个jni来调用C层接口,实现给指定的apk赋权限。然后执行安装apk过程
permission_change.cpp
Android.mk如下:
4.拷贝apk
条件:
获取系统权限
拷贝apk到data/app
注:4.2和4.0上以测试通过,不过没有回调提示的,需要自己代码实现
- android实现静默卸载和静默安装
- android 实现静默安装、卸载
- android 实现静默安装、卸载
- android 实现静默安装、卸载
- android 实现静默安装、卸载
- android 静默安装、卸载实现
- android 实现静默安装、卸载
- android 实现静默安装、卸载
- android 实现静默安装和卸载
- android 实现静默安装和卸载
- Android实现静默安装与卸载
- Android实现静默安装与卸载
- Android实现静默安装与卸载
- Android实现静默安装与卸载
- android 实现静默安装、卸载(图)
- Android实现静默卸载
- android静默安装、静默卸载apk方法
- Android静默安装和静默卸载
- 家用电器排行榜
- 无法将成员变量添加到ID为 的控件中
- Android 4.4中AudioRecord用例 - 录制系统内置声音
- android webview 跨域问题
- Linux查看文件编码格式及文件编码转换
- android 实现静默安装、卸载
- js上下无缝滚动代码
- 详解Android动画之Tween Animation
- hadoop单机伪分布式部署方法简单介绍
- Android中的JSON详细总结
- (E)237. Delete Node in a Linked List
- 51nod 1719 数值计算(二分)
- Git中的Reference及其refspec概述
- 高斯混合模型