android 实现联网下载并自动更新(适配了android10.0)

功能:

  功能就是在手机上联网下载最新的手机安装包,然后自动安装,模拟的是手机自动更新的功能,有兴趣的可以看一下。

预览:

在这里插入图片描述

例子下载

https://download.csdn.net/download/ljp345775/12548884

用到的技术:

1、动态申请权限,我这里用到了严振杰老师的第三方permission
2、网络下载文件,我这里用到的是OKhttp3,如果有兴趣可以看一下我以前的一遍文章 Okhttp3封装带保存cookie
3、进度条,我用的是 PictureProgressBar
4、 FileProvider的使用
5、android 10.0 的保存适配

代码实现:

onCreate方法

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;
        //判断手机版本来申请权限
       if(Build.VERSION.SDK_INT<29){
           PermissionUtils.applyPermission(mActivity, this);
       }else {
           setContentView(R.layout.activity_main);
           initView();
           //拿到保存的根目录
           if (FileUtils.mkdir(mActivity)) {
               rootPath = FileUtils.getRootPath(mActivity);
           }
       }

    }

申请权限实现的方法

/**
 * 同意的权限
 *
 * @param data
 */
@Override
public void onGranted(List<String> data) {

    if (Build.VERSION.SDK_INT < 29) {
        if (data.contains(Manifest.permission.READ_EXTERNAL_STORAGE) && data.contains(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            setContentView(R.layout.activity_main);
            initView();
            if (FileUtils.mkdir(mActivity)) {
                rootPath = FileUtils.getRootPath(mActivity);
            }
        }
    } else {
        setContentView(R.layout.activity_main);
        initView();
        if (FileUtils.mkdir(mActivity)) {
            rootPath = FileUtils.getRootPath(mActivity);
        }
    }
}

/**
 * 决绝的权限
 *
 * @param data
 */
@Override
public void onDenied(List<String> data) {

    if (Build.VERSION.SDK_INT >= 29) {
        setContentView(R.layout.activity_main);
        initView();
        if (FileUtils.mkdir(mActivity)) {
            rootPath = FileUtils.getRootPath(mActivity);
        }
    }
}

点击事件

 @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btn_down) {
            new AlertDialog.Builder(mActivity)
                    .setTitle("提示")
                    .setMessage("目前有新版本,已优化,请点击确定升级")
                    .setPositiveButton("确定", (dialog, which) -> {
                        //下载手机apk
                        downApk();
                    })
                    .create()
                    .show();
        }
    }

downApk方法

/**
 * 联网下载apk
 */
private void downApk() {
    try {
        UtilsOKHttp.getInstance(mActivity).downFile(url, rootPath, new UtilsOKHttp.OKCallback() {
            @Override
            public void onSuccess(String result) {
                //成功返回文件目录
                if (result != null && result.length() > 0) {
                    //开始安装
                    installApk(result);
                }
            }

            @Override
            public void onProcess(int i) {
                //过程
                pb1.setProgress(i);
                if (i == 100) {
                    Toast.makeText(mActivity, "下载成功", Toast.LENGTH_SHORT).show();
                    pb1.setAnimRun(false);
                }
            }

            @Override
            public void onFail(String failResult) {
                //失败
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

downApk方法

/**
 * 安装 apk
 *
 * @param path
 */
private void installApk(String path) {
    try {
        File file = new File(path);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri data = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权
            // 注意 下面参数com.com.ljp.downdemo 为apk的包名加上.fileprovider,
            data = FileProvider.getUriForFile(mActivity, "com.ljp.downdemo.fileprovider", file);
        } else {
            data = Uri.fromFile(file);
        }
        intent.setDataAndType(data, "application/vnd.android.package-archive");
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章