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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章