Android 获取android安装apk框的安装状态(如点击取消、返回)
最近鼓捣android,碰到个问题,因为没有root权限,需要调用Intent安装apk,但需要获取用户是否安装了(如,用户点击了返回或取消),查了很多文章,最后可以解决,但有瑕疵,解决方法如下:
public static void installPackage(Context context, File file, int requestCode) {
// 安装之前先记录预安装APK文件的名字,以用于返回结果时根据requestCode获取安装的apk packageName
MainActivity.m_mapInstallApkData.put(requestCode, file.getName()); //gxj: 如果主界面没有显示,需要调出主界面到前台
Intent it1 = new Intent(context, MainActivity.class);
it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
context.startActivity(it1); //gxj: <span style="color:#ff0000;">不使用FLAG_ACTIVITY_NEW_TASK是因为无法获取result</span>,同时又要保持多个apk(task)的安装(FLAG_ACTIVITY_SINGLE_TOP / FLAG_ACTIVITY_PREVIOUS_IS_TOP)
//<span style="color:#ff0000;">对于使用FLAG_ACTIVITY_SINGLE_TOP / FLAG_ACTIVITY_PREVIOUS_IS_TOP的情况,startActivityForResult只有在所有的安装界面消失的时候才会有返回,且返回的resultCode都是0,疑惑,所以在返回后需要检查否安装成功的判断</span>
//不能使用Intent.FLAG_ACTIVITY_NEW_TASK是因为Intent.FLAG_ACTIVITY_NEW_TASK无法获得返回的结果;不能使用Intent.FLAG_ACTIVITY_CLEAR_TOP是因为可能会有多个apk同时安装
Intent it2 = new Intent();
it2.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP ); //或FLAG_ACTIVITY_PREVIOUS_IS_TOP
it2.setAction(android.content.Intent.ACTION_VIEW);
Uri path = Uri.fromFile(file);
it2.setDataAndType(path, "application/vnd.android.package-archive");
context.startActivityForResult(it2, requestCode);
}
在MainActivity中添加protected void onActivityResult(int requestCode, int resultCode, Intent data)处理
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String strPackageName = null;
if (m_mapInstallApkData != null)
strPackageName = m_mapInstallApkData.remove(requestCode); //不知道为什么,不管是否点击安装、取消,返回的resultCode都是0,即RESULT_CANCELED,待查
if (resultCode == RESULT_CANCELED) {
if (!TextUtils.isEmpty(strPackageName)) {
//需要重新检查该packageName是否安装了
//..做自己的处理
}
}
}
注:该程序有瑕疵,就是假如弹出安装apk的框A和apk框B,点击B的取消没有反应,只有在A、B的安装框都消失(点击安装或取消或返回)后才会有返回(分别返回了A和B的结果),解决方法还没有找到,待
Android 获取android安装apk框的安装状态(如点击取消、返回)的更多相关文章
- android获取未安装APK签名信息及MD5指纹
站在巨人的肩膀上写博客: http://blog.csdn.net/wulianghuan/article/details/18400581 http://www.jb51.net/article/7 ...
- android 命令行安装apk
有两种方式可以在android模拟器或真机上使用命令行安装apk 一种是使用adb install命令,网上通常是这种方式 另一种是通过android提供的命令,pm install. 需要先进入an ...
- 【树莓派】在树莓派的Android系统中安装APK应用
树莓派3 Android TV安装APK应用教程 本文摘自:http://www.mz6.net/news/android/6867.html 树莓派3 Android TV怎样安装软件?对于熟悉AD ...
- android 内部存储 安装apk
在做应用自动更新模块下载apk时遇到了内部存储和sd卡存储两种情况,存在sk卡中存储apk可以正常安装,可是在内部存储中安装apk时出现了parse error的问题. 在网上搜了搜,大致分为两种方案 ...
- Monkey入门之如何在android虚拟机中安装apk包
如果想把公司的产品apk包安装到android虚拟机中,应该进行如下操作: 1.首先将apk包放到C:\Program Files\Android\android-sdk\platform-tools ...
- Android获取手机安装的浏览器列表
最近碰到一个同事询问如何查询本地安装的浏览器列表,其使用的代码如下: public static List<ResolveInfo> getBrowserList(Context cont ...
- Android模拟器Genymotion安装apk
一.下载apk 选择你需要安装的apk进行下载,下载完以后放在与adb.exe同一目录下: 看我的 二.安装apk遇到的问题 开启Genymotion模拟器,然后cmd到你的platform-tool ...
- Monkey学习(3)如何在Android模拟器中安装apk
1.运行SDK Manager,选择模拟器,并运行模拟器,我这里用的是已经配置好的模拟器“RedMI” 2.已启动好的模拟器“RedMI” 3.记住需要安装apk文件的位置,我这里放在了F盘的根目录下 ...
- android之手动安装apk到模拟器
一.将apk放到SDK的指定路径 二.打开命令行 三.安装apk到模拟器 此处遇到无法找到主机,解决办法: 发现是进程2512堵塞导致的 进入powershell 查看进程 发现2512进程是360手 ...
随机推荐
- MVC系统学习4—ModelMetaData
在Mvc R2中,新引入了一些扩展方法,如后面带一个for的方法,这些扩展方法会根据Model的属性自定生成相应的Html元素,如Html.EditFor(Model=>Model.IsAppr ...
- [luoguP1072] Hankson 的趣味题(数论)
传送门 由题意得 gcd(x, a0) = a1 ——> gcd(x / a1, a0 / a1) = 1 lcm(x, b0) = b1 ——> x * b0 / gcd(x, b0) ...
- 总结懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session
如下错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session 原因是懒加载的问题,因为 ...
- codevs1174 靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...
- P1082||T1200 同余方程 codevs|| 洛谷
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond http://codevs.cn/problem/1200/||https://www.luogu.o ...
- html缓存机制,http头部控制
1.缓存分类:服务器缓存(协商缓存),第三方缓存,浏览器缓存(强制缓存) 2.浏览器缓存(添加 meta),设置请求指定的http头部信息.(状态码200,from cache , from dist ...
- maven更改镜像路径为阿里镜像,以便下载速度快
1.maven更改镜像路径为阿里镜像,以便下载速度快 2.maven每更新一次镜像地址,都会重新下载一次包 3. 怎么配maven链接阿里云的镜像详细步骤 修改maven根目录下的conf文件夹中的s ...
- 编译Linux使用的.a库文件
编译Linux使用的.a库文件 首先是须要编译成.a的源文件 hello.h: #ifndef __INCLUDE_HELLO_H__ #define __INCLUDE_HELLO_H__ void ...
- javascript中数组的定义及使用
js <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- POJ 1260-Pearls(DP)
Pearls Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7465 Accepted: 3695 Descriptio ...