Android 获取android安装apk框的安装状态(如点击取消、返回)

本文介绍了一种在Android应用中监控用户安装APK流程的方法。通过Intent启动安装过程,并利用特定标志来试图捕捉安装结果,尽管存在一些局限性,例如无法直接获取到所有预期的返回值。文中提供了一个具体实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近鼓捣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的结果),解决方法还没有找到,待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值