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手 ...
随机推荐
- swift kilo版代码更新
今天重新搭建swift服务器,git下代码后一时好奇,进入kilo/stable branch后,与四个月前下载的swift/kilo版本做了个比较.使用diff命令完成.发现代码还是略有区别. di ...
- [K/3Cloud]调用动态表单时,传递自定义参数
插件中在调用动态表单时,通过DynamicFormShowParameter的CustomParams,增加自定义的参数. private void ShowMaterialStock() { obj ...
- 母函数(Generating function)详解
母函数(Generating function)详解 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用 ...
- 非常适合新手的jq/zepto源码分析06 -- 事件模型
复习下事件的有关内容: 1.现在用的绑定/删除: obj.addEventListener(type,fn,false) obj.removeEventListener(type) obj.attac ...
- *** + Polipo 配置全局代理(Linux 版本)
转,原文:http://blog.csdn.net/jon_me/article/details/53525059 我本来是想查这个问题: How to start server and local ...
- 新手学測试----Unit Test(单元測试)
在程序猿做项目的过程中,每当完毕一个功能,首先自己须要对完毕的功能进行測试.我如今正在做的项目用的工具是VS2012.那么接下来,就说一说在VS2012中是怎样创建单元測试的. 怎样创建单元測试? 在 ...
- 【解决】hive与hbase表结合级联查询的问题
[Author]: kwu [解决]hive与hbase表结合级联查询的问题.hive两个表以上,关联查询时出现长时无法返回的情况. 同一时候也不出现,mr的进度百分比. 查询日志如图所看到的: 解决 ...
- 【Ubuntu】莫名其妙硬盘空间满了
一个个翻找,发现是 ~/.cache 占用了很多空间,遂删去其中内容 没有什么负面影响,删掉之后节省了许多空间
- 简析LCD1602液晶驱动及在Arduino上的实例实现
这几日在倒腾新到的Arduino,比起普通单片机来,感觉写程序太简单了.不过和外设打交道还是没那么容易,比如今天要说的看似简单的LCD1602液晶,却费了我一整天才基本搞懂,不过还是有一个小问题没有实 ...
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...