使用下载管理器下载后安装 apk 并退出应用程序

2024-03-13

我已经创建了一个 Android 应用程序,如果有任何新版本发布,它将从服务器自动开始使用内置的“下载管理器”下载。为了在完成下载后自动安装,我创建了一个广播接收器来通知下载已完成并完成,然后我开始安装它。在我停留在应用程序中时它工作正常并且不关闭它。但我的问题是当我关闭应用程序时。所以下载完成后我想自动安装它。但我不会发生。对于这个问题我该怎么办?

    private void download(String link) {
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(link));
    request.setDescription("new version");
    request.setTitle("app name");
    request.setMimeType("application/vnd.android.package-archive");
    request.setDestinationInExternalFilesDir(getApplicationContext(), Environment.DIRECTORY_DOWNLOADS, "myapk.apk");
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

    downloadID = dm.enqueue(request);


    br = new BroadcastReceiver() {

        @Override
        public void onReceive(Context c, Intent i) {
            String action = i.getAction();

            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {

                DownloadManager.Query query = new DownloadManager.Query();
                query.setFilterById(downloadID);

                Cursor downloadResult = dm.query(query);

                if (downloadResult.moveToFirst()) {
                    int statusColumnIndex = downloadResult.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    int status = downloadResult.getInt(statusColumnIndex);

                    if (status == DownloadManager.STATUS_SUCCESSFUL) {
                        //download completed successfully
                        int localFileNameId = downloadResult.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);

                        String downloadPathFile = downloadResult.getString(localFileNameId);
                        String downloadPathDir = downloadPathFile.substring(0, downloadPathFile.lastIndexOf("/") + 1);
                        String downloadName = downloadPathFile.substring(downloadPathFile.lastIndexOf("/") + 1);

                        Log.i("name =", downloadName);

                        File file = new File(downloadPathDir);
                        File[] files = file.listFiles();
                        for (File f : files) {
                            if (f.isFile() && f.exists() && !f.getName().equals(downloadName)) {
                                f.delete();
                            }
                        }

                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setDataAndType(Uri.fromFile(new File(downloadPathFile)), "application/vnd.android.package-archive");
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                        unregisterReceiver(br);
                    }
                }
            }
        }
    };

    registerReceiver(br, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

}

你可以这样做:

在你的清单中

<receiver android:name="packageName.DownloadReceiver" android:exported="true"> 
    <intent-filter> 
        <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> 
    </intent-filter> 
</receiver>

然后在DownloadReceiver.java例如添加处理自动安装的逻辑

public class DownloadReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            // add your logic here
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用下载管理器下载后安装 apk 并退出应用程序 的相关文章

  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • Android上如何模拟后台Activity因内存不足而被系统杀死的过程?

    我正在处理 内存不足 不再有后台进程 问题 当这种情况发生时 我的活动处于后台并被杀死 我正在尝试保存并加载实例状态来解决它 但因为它并不是每次都会发生 在这种情况下我应该如何测试我的活动 Thanks 您可以通过 adb 强制进程终止 g
  • Android 应用程序在启动时打开应用程序信息屏幕,而不是启动主 Activity

    我不确定这是否是一个问题 但这是我第一次遇到这个问题 我正在开发一个应用程序 当我在进行一些编码后断开应用程序与 Android Studio 和 PC 的连接时 如果我尝试在手机上打开应用程序 它会启动app info屏幕 我们看到强制停
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • Android 中的 Sugar ORM:更新 SQLite 中保存的对象

    我是在 Android 上使用 SQLite 和 Sugar ORM 进行应用程序开发的新手 并尝试阅读 Sugar ORM 文档 但没有找到有关如何更新 SQLite 中保存的对象的任何信息 更改对象属性后还可以保存对象吗 就像是 Cus
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • 更改卡片高度即更改 Jetpack 中与 Material 3 组合的卡片颜色

    我正在使用 Card 可组合项 我希望它的颜色为白色 但是当我向它添加一些高度时 它的颜色会更改为更像主要容器颜色 我看过文档 其中有一种称为高程覆盖的东西 但找不到说明如何使用它的示例 这是我的代码 Card modifier Modif
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 使用 Android Firebase 堆栈推送通知

    我开发了使用 Firebase 接收推送通知的 Android 应用程序 我的代码基于 Firebase Google 官方文档 https firebase google com docs cloud messaging android
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • 如何从android中的外部存储中获取所选文件的文件路径?

    我在选择文件的文件路径时遇到问题 我搜索了整个堆栈溢出 但问题没有解决 从设备中选择文件的代码如下所示 Intent intent new Intent Intent ACTION GET CONTENT intent setType in
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • Android 中的列表视图分页

    我有一个列表视图 其中显示了 50 个元素 我决定对视图进行分页 以便视图的每个部分都有 10 个元素 然后单击 下一个 按钮以获取下一个 10 个元素 如何设置10个数据 我关注这篇文章http rakhi577 wordpress co
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 如何在布局编辑器中模拟沉浸式模式

    我想在布局编辑器中全屏查看我的布局 我正在使用 eclipse 插件 我已经通过选择隐藏了 ActionBar NoActionBar组合中的主题 但导航栏是一个不同的故事 AFAIK 它只能使用代码中的标志来隐藏 我需要在活动 xml 文

随机推荐

  • Python Sympy 求解返回列表与字典

    我正在使用 sympy 及其求解函数 但我注意到它有时返回列表中的字典 但在其他情况下仅返回字典 没有列表 from sympy import x y symbols x y q 16 x 0 5 y 0 5 solve diff q x
  • 如何使 Autodesk Forge Viewer 支持 .rcp 文件

    我有一个 Web 项目 React 使用 Autodesk Forge Viewer 显示我们的企业 BIM360 帐户中的 3D 和 2D 模型 自去年以来 在 BIM360 中运行的同一查看器现在支持 rcp文件 我们也希望允许它 但到
  • 下载文件时文件名中出现空格问题

    以下 java 代码用于通过 Web 应用程序下载请求日志文件 protected HttpServletResponse response response setContentType application octet stream
  • W3C HTML 验证器中的 Angular2 语法

    Angular 1 x 允许将元素放入 HTML 中 而这在当时并不为人所知W3C HTML 验证器 https validator w3 org nu 解决方法是添加data 前缀并写入例如data ng repeat代替ng repea
  • 从 Java 中的 JSON 数组对象获取字符串值

    编辑 我实际上找到了答案 我无法关闭问题 因为我是新人 我能够使用 Array getString i 返回所需的字符串值 感谢您的所有帮助 我有这样的 JSON List example1 example2 example3 exampl
  • 如何使 xtick 与 Python matplotlib 中的 xlim 不同?

    我想用 Python 制作一年中每天的动态图 X轴的axes将是12个月 这个过程在Matplotlib中将是一个barh 代码如下 import random import datetime import matplotlib pyplo
  • PHP:定义具有可变参数计数的函数? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以在 PHP 中定义一个函数 让您定义可变数量的参数 用我更熟悉的语言来说是这样的 function myFunction rest rest array of params return res
  • 如果不存在则不工作

    IF NOT EXISTS SELECT FROM user WHERE name Rutvij AND lang python BEGIN INSERT INTO user VALUES Rutvij python 25 END ELSE
  • jQuery UI 对话框的行为不可预测

    jQuery UI 对话框让我感到厌烦 据我所知 它的工作原理如下 当你这样做时 myDialog dialog 它复制 myDialog 元素并将其移动到 body 标记底部的这个奇怪的小部件中 这太疯狂了 执行此操作时 它会复制可能唯一
  • Ruby 按列对 .dat 文件进行排序

    我对红宝石很陌生 我正在尝试打开文件 dat 并按第二列降序排序 到目前为止 我能够打开该文件并阅读全部内容 请问有什么建议吗 非常感谢 file 1 88 59 74 53 8 0 00 280 9 6 270 17 1 6 93 23
  • 使用 Carrierwave 和 rmagick 上传到 s3 的 exif 图像旋转问题

    我的 Rails 应用程序中有照片上传功能 该应用程序通过 rmagick 和雾通过 Carrierwave 直接上传到 s3 我遇到的问题是 当通过手机通过肖像中的 拍照选项 上传照片时 注意这是 iPhone 上的 但我相信 Andro
  • iOS Facebook SDK“必须使用活动访问令牌来查询有关当前用户的信息。”

    我有一个令牌 但不断收到此错误 必须使用活动访问令牌来查询有关当前用户的信息 如有任何帮助 我们将不胜感激 NSLog TOKEN FBSession activeSession accessToken NSString picture N
  • 使用其他自变量的所有可能组合获取许多模型中特定变量的 p 值

    我正在尝试使用一组自变量的所有可能组合来运行许多回归模型 在此示例中 我对以下系数感兴趣cyl与列出的其他变量的所有可能组合xlist df lt mtcars md lt mpg cyl xlist lt c disp hp am n l
  • 为什么 Spring-Data-JPA 异步不起作用?

    我正在尝试使用 Spring Boot 和 Spring data JPA 创建一个非阻塞休息服务 如何使用 Spring Data JPA Async 支持对实体进行异步保存 尽管其他选择似乎在同一实体上工作 但下面的代码对我不起作用 我
  • 从 R 中的箱线图框架中删除顶部和右侧边框

    有谁知道如何删除 R 中箱线图框架的顶部和右侧边框 我尝试过参数frame FALSE 但这会删除除左侧 y轴 之外的所有边 我只想显示 x 轴和 y 轴 提前致谢 我认为你需要使用axis side 1 绘图后 x lt 1 5 boxp
  • 我可以使用什么工具来合并 wsdl 和 xsd 文件?

    我有两个文件 一个包含 Web 服务描述 wsdl 第二个包含 Web 服务中使用的数据结构 xsd 我什么都没有了 网络服务还不能工作 我需要将它们合并为一个 因为 Delphi 7 WSDL Importer 不能很好地处理包含的 xs
  • Python 在池映射中使用列表/多个参数

    我正在尝试将列表作为参数传递给pool map co refresh input list 然而 pool map没有触发该功能co refresh 并且也没有返回错误 看起来这个过程挂在那里 原始代码 from multiprocessi
  • 更改 VS Code 中注释周围字符的颜色

    如何更改 VS Code 中注释前后字符的颜色 我正在谈论 or 或 字符 我知道如何更改评论颜色 如何更改 Visual Studio 代码中注释的颜色 https stackoverflow com questions 45195023
  • TypeScript - 扩展标准库 Math 的类型定义

    我想使用 javascript 库 种子随机 js https github com davidbau seedrandom 在 TypeScript 项目中 尚无法弄清楚如何为此库编写类型定义 该库使用附加方法扩展了标准 javascri
  • 使用下载管理器下载后安装 apk 并退出应用程序

    我已经创建了一个 Android 应用程序 如果有任何新版本发布 它将从服务器自动开始使用内置的 下载管理器 下载 为了在完成下载后自动安装 我创建了一个广播接收器来通知下载已完成并完成 然后我开始安装它 在我停留在应用程序中时它工作正常并