Android app下载更新(包含7.0 8.0适配)

  • 在很多的APP中,我们一般采用的是APP接口链接更新,或者第三方平台更新。

我们现在来说说的是链接下载更新APP。

1.首先添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<!--8.0请求安装包权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /

android有很多机型,版本。一定要注意的就是适配。

下面贴出代码。

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                首先检测是否有写入权限
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
//                    没有权限去申请
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            REQUEST_CODET);
                }else {
//                    拥有权限 进行下载
                        DownApkLoad();
                }
            }
        });

动态权限的申请 返回结果

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode==REQUEST_CODET){
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//                赋予权限成功进行的下步操作
                DownApkLoad();
            }
        }
    }

下载用的是系统带的DownloadManager

    private void DownApkLoad() {
//        app的下载地址
        String path="";
        Uri uri = Uri.parse(path);
        DownloadManager.Request req = new DownloadManager.Request(uri);
        //设置网络状态下进行更新
        req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
        //下载中和下载完后都·显示通知栏
        req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        //使用系统默认的下载路径 此处为应用内 /android/data/packages ,所以兼容7.0 8.0
        req.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "app的名字.apk");
        //通知栏标题
        req.setTitle("APP的名字");
        //通知栏描述信息
        req.setDescription("下载中");
        //设置类型为.apk
        req.setMimeType("application/vnd.android.package-archive");
        req.setVisibleInDownloadsUi(true);
        //获取下载任务ID
        DownloadManager dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
        downloadId=dm.enqueue(req);
        registerReceiver(new DownloadReceiver(), new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

最后一步 广播检测 完成安装

    private class DownloadReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            DownloadManager dManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
            Intent install = new Intent(Intent.ACTION_VIEW);
            install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        //根据id判断如果文件已经下载成功返回保存文件的路径
            Uri downloadFileUri = dManager.getUriForDownloadedFile(downloadId);
            Log.d("DownloadManager", "apk存储路径 : " + downloadFileUri);
            install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
            if (downloadFileUri != null) {
                if ((Build.VERSION.SDK_INT >= 24)) {//判读版本是否在7.0以上
                    install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    //添加这一句表示对目标应用临时授权该Uri所代表的文件
                    //  不添加无法安装 或者出现解析包异常
                }
                context.startActivity(install);
            }
        }
    }

当然广播还是在ondestory()中取消广播注册的接收者

xml布局就是一个button控件,代码已全部贴出可以直接参考学习使用。

猜你喜欢

转载自blog.csdn.net/sqj199567/article/details/81286519