Android 下载并安装apk,兼容7.0和8.0

小编 2026-06-10 阅读:773 评论:0
1、下载apk文件 下载的方式有很多种,常用的有: (1)调用系统下载器下载,需要设置通知来接受下载完成的操作,然后进入安装流程 (2)最简单的,直接调起系统浏览器访问apk下载链接,后续的事情都不管...

1、下载apk文件

下载的方式有很多种,常用的有:

(1)调用系统下载器下载,需要设置通知来接受下载完成的操作,然后进入安装流程

(2)最简单的,直接调起系统浏览器访问apk下载链接,后续的事情都不管,等下载完了用户自行安装

(3)自己写下载代码,缺点是不如前两者稳定,优点是下载进度和状态可控

我这里使用的是第三种,然后下载代码并不自己写,而是直接调用OkHttpUtils框架,OkHttpUtils框架的配置跟导入这里不再赘述,具体自己查一下用法,直接上下载代码(不要忘了网络权限跟存储权限):

isDownloading = true;//是否正在下载,同一时间不给同时进行多个下载任务
        final TextLoadingPopupWindow textLoadingPopupWindow = new TextLoadingPopupWindow(getActivity());//进度提示弹窗,具体替换自己的弹窗,这里不提供
        textLoadingPopupWindow.setText(\"00.0%\");
        textLoadingPopupWindow.show();
        OkHttpUtils.get(url)
                .execute(new FileCallback(new PathUtil().getMusicEditorPath(), UUID.randomUUID().toString() + \".apk\") {//这里指定下载保存文件的路径
                    @Override
                    public void onSuccess(File file, Call call, Response response) {
                        isDownloading = false;
                        textLoadingPopupWindow.dismiss();
                        installApp(file);//下载完成,调起安装
                    }

                    public void onError(Call call, Response response, Exception e) {
                        isDownloading = false;
                        textLoadingPopupWindow.dismiss();
                        ToastUtils.showToast(getContext(), \"下载出错\");
                    }

                    public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                        textLoadingPopupWindow.setText((int) (progress * 100) + \".\" + (int) (progress * 1000) % 10 + \"%\");//进度显示,处于UI线程
                    }
                });

2、安装apk

文件准备好了之后就是安装了,安装主要需要注意7.0和8.0两个系统的兼容.

(1)7.0适配

需要用到fileprovider,需要在res文件夹下创建一个xml文件,我这里叫xxxxxx.xml,主要就是配置几个路径,你需要安装的apk文件在调用安装之前,需要先移到这几个路径之下才可以。

<paths xmlns:android=\"http://schemas.android.com/apk/res/android\">
    <external-path name=\"xxxxx\" path=\"xxxxx\" />
</paths>

xml准备好了之后,需要去AndroidManifest.xml里面配置一下

<provider
            android:name=\"android.support.v4.content.FileProvider\"
            android:authorities=\"这里替换成你的包名.fileprovider\"
            android:exported=\"false\"
            android:grantUriPermissions=\"true\">
            <meta-data
                android:name=\"android.support.FILE_PROVIDER_PATHS\"
                android:resource=\"@xml/xxxxx\" />
        </provider>

(2)8.0适配

适配了7.0之后,8.0基本上没啥问题了,唯一的区别就是8.0需要加上一个权限


    <uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" />

如果觉得有必要的话,8.0可以在调起安装之前校验一下本应用是否已经有了可以安装其他应用的权限,如果没有则直接跳转到手机设置的相关页面,这里需要说一下,在我亲测的几台手机中,如果使用了这个逻辑,基本上是会跳转到一个设置页面,页面是一箩筐的应用列表,很难找到自己的app并进去设置“允许安装未知应用”这个东西,个人觉得这个体验很不好,而如果是直接调用安装代码,则系统会自发的提示是否需要开启这个应用“允许安装未知应用”的这个东西,所以这里的代码就是执行直接调起安装操作,是否具备权限就不验证了。

 /**
     * 调起安装
     *
     * @param file
     */
    private void installApp(File file) {
        if (file == null || !file.getPath().endsWith(\".apk\")) {
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);

        //判读版本是否在7.0以上
        if (Build.VERSION.SDK_INT >= 24) {
            Uri apkUri = FileProvider.getUriForFile(getActivity(), \"你的包名.fileprovider\", file);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(apkUri, \"application/vnd.android.package-archive\");
        } else {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(file), \"application/vnd.android.package-archive\");
        }
        getActivity().startActivity(intent);
    }

本代码在7.0的vivo手机和8.0的小米手机上亲测有效。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表