Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上

具体查看代码:

首先在清单文件配置三个权限读写权限和请求安装权限(兼容Android8.0手机)如下:


    <!--安装apk权限-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard 读写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

兼容Android7.0 FileProvider

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

记得在res下面配置xml文件夹:如下:

下面是provider_paths.xml的文件内容

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

然后上下载和安装的代码:

  /**
     * 下载apk的方法
     *
     * @param activity 上下文
     */
    public void downloadApk(final Activity activity) {
        HttpUtils httpUtils = new HttpUtils();
        // 判断sd卡是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            final String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/jfsj.apk";
//            httpUtils.download("http://cdn1.down.apk.gfan.net.cn/Pfiles/2020/05/21/gfanxapp_20200521194529_45df3390-b57e-4c16-b0fb-fb0ebcac1a80.apk", "/mnt/sdcard/mobilesafe72_2.apk",
            httpUtils.download("https://imtt.dd.qq.com/16891/apk/53F52C519A0CDEF8A6BA6579A7BD20F2.apk?fsname=com.wifi.key_5.8.9_589.apk&csr=1bbd", filePath,
                    new RequestCallBack<File>() {
                        // 下载成功的时候调用
                        @Override
                        public void onSuccess(ResponseInfo<File> arg0) {
                            CommonLoading.getInstance().closeDialog();
                            Toast.makeText(activity.getApplicationContext(), "下载成功", Toast.LENGTH_SHORT).show();
                            // 安装最新版本
                            install(filePath, activity);
                        }

                        // 下载失败的时候调用
                        @Override
                        public void onFailure(HttpException arg0, String arg1) {
                            Log.e("下载失败", "失败了:" + arg0.getLocalizedMessage());
                            Toast.makeText(activity.getApplicationContext(), "下载失败了," + arg0.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                        }

                        @Override
                        public void onLoading(long total, long current, boolean isUploading) {
                            super.onLoading(total, current, isUploading);
                            long progress = (current / total) * 100;
                            Log.e("下载进度", current + "/" + total + ":进度" + progress + "%");
                        }
                    });
        }
    }

    /**
     * 安装最新版本
     *
     * @param filePath 安装包的路径
     */
    private void install(String filePath, Activity activity) {
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        Uri fileURI;
        File file = new File(filePath);
        if (Build.VERSION.SDK_INT >= 24) {
            fileURI = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", file);
        } else {
            //android70.以下手机
            fileURI = Uri.fromFile(file);
        }

        //Android7.0以上必须添加如下代码
        activity.grantUriPermission(activity.getPackageName(), fileURI, Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        intent.setDataAndType(fileURI, "application/vnd.android.package-archive");
        // 当当前的activity退出的时候,会调用之前activity的onActivityResult方法
        activity.startActivityForResult(intent, 0);
    }

使用方法:调用downloadApk这个方法即可。

注意记得添加动态权限否则报错,还有就是如果使用android9.0以上手机并且你的网址是http的非https,记得在清单文件添加如下:否则可能会无法下载apk

扫描二维码关注公众号,回复: 12869068 查看本文章
android:usesCleartextTraffic="true"

猜你喜欢

转载自blog.csdn.net/xiayiye5/article/details/106523227