本文已参与「新人创作礼」活动,一起开启掘金创作之路。
功能:
功能就是在手机上联网下载最新的手机安装包,然后自动安装,模拟的是手机自动更新的功能,有兴趣的可以看一下。
预览:
例子下载
download.csdn.net/download/lj…
用到的技术:
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();
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END