Android-app自动更新总结(已适配9-0)(1)

}

//检查版本号,第一次请求(post),,,UpdateAppBean根据服务器返回生成

private void requestAppUpdate(int version, final DataRequestListener listener) {

OkGo.post(Const.HOST_URL + Const.UPDATEAPP).params("version", version).execute(new StringCallback() {

@Override

public void onSuccess(Response response) {

Gson gson = new Gson();

UpdateAppBean updateAppBean = gson.fromJson(response.body(), UpdateAppBean.class);

if (updateAppBean.getStatus() == 0) {

listener.success(updateAppBean);

} else {

listener.fail(updateAppBean.getMsg());

}

}

@Override

public void onError(Response response) {

listener.fail("服务器连接失败");

dismissLoadingDialog();

}

});

}

//如果有新版本,提示有新的版本,然后下载apk文件

private void updateApp(String apk_url) {

dismissLoadingDialog();

DialogUtils.getInstance().showDialog(this, "发现新的版本,是否下载更新?",

new DialogUtils.DialogListener() {

@Override

public void positiveButton() {

downloadApp(apk_url);

}

});

}

//下载apk文件并跳转(第二次请求,get)

private void downloadApp(String apk_url) {

OkGo.get(apk_url).tag(this).execute(new FileCallback() {

@Override

public void onSuccess(Response response) {

String filePath = response.body().getAbsolutePath();

Intent intent = IntentUtil.getInstallAppIntent(mContext, filePath);

// 测试过这里必须用startactivity,不能用stratactivityforresult

mContext.startActivity(intent);

dismissLoadingDialog();

mDownloadDialog.dismiss();

mDownloadDialog=null;

}

@Override

public void downloadProgress(Progress progress) {

// showDownloadDialog();

// mProgress.setProgress((int) (progress.fraction * 100));

if (mDownloadDialog == null) {

// 构造软件下载对话框

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

builder.setTitle("正在更新");

// 给下载对话框增加进度条

final LayoutInflater inflater = LayoutInflater.from(mContext);

View v = inflater.inflate(R.layout.item_progress, null);

mProgress = (ProgressBar) v.findViewById(R.id.update_progress);

builder.setView(v);

mDownloadDialog = builder.create();

mDownloadDialog.setCancelable(false);

mDownloadDialog.show();

}

mProgress.setProgress((int) (progress.fraction * 100));

}

});

}

2.2 DataRequestListener:

public interface DataRequestListener {

//请求成功

void success(T data);

//请求失败

void fail(String msg);

}

接下来是工具类,来自github,参考,https://github.com/vondear/RxTool

2.3 AppUpdateUtil:

/**

* 获取App版本码

*

* @param context 上下文

* @return App版本码

*/

public static int getAppVersionCode(Context context) {

return getAppVersionCode(context, context.getPackageName());

}

2.4 IntentUtil:

public class IntentUtil {

/**

* 获取安装App(支持7.0)的意图

*

* @param context

* @param filePath

* @return

*/

public static Intent getInstallAppIntent(Context context, String filePath) {

//apk文件的本地路径

File apkfile = new File(filePath);

if (!apkfile.exists()) {

return null;

}

Intent intent = new Intent(Intent.ACTION_VIEW);

Uri contentUri = FileUtil.getUriForFile(context, apkfile);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

}

intent.setDataAndType(contentUri, "

application/vnd.android.package-archive");

return intent;

}

2.5 FileUtil:

/**

* 将文件转换成uri(支持7.0)

*

* @param mContext

* @param file

* @return

*/

public static Uri getUriForFile(Context mContext, File file) {

Uri fileUri = null;

if (Build.VERSION.SDK_INT >= 24) {

fileUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", file);

} else {

fileUri = Uri.fromFile(file);

}

return fileUri;

}

3.遇到的问题

9.0手机authorities配置出错,导致无法安装,

解决办法:

1.项目中使用了Androidx,AndroidManifest.xml的配置中就必须使用androidx的fileprovider

2.这里的authorities与FileUtil.java中的要一样,我就是字母P大写了导致错误

金三银四马上就要过去了,还没有找到工作的伙伴推荐一篇文章:
"寒冬未过",阿里P9架构分享Android必备技术点,让你offer拿到手软!

Uzg-1718560595077)]

金三银四马上就要过去了,还没有找到工作的伙伴推荐一篇文章:
"寒冬未过",阿里P9架构分享Android必备技术点,让你offer拿到手软!
相关推荐
肖。35487870941 分钟前
[技巧-11]AndroidManifest.xml完善小技巧。
android
小羊子说17 分钟前
Android 车机开发中常用的adb 脚本(更新中)
android·linux·adb·性能优化·车载系统
用户76074953978324 分钟前
Android页面四大布局运行结果
android
风往哪边走26 分钟前
搜索框自定义
android
用户8249281925361 小时前
把android资源类型详解
android
IT观测1 小时前
深度分析俩款主流移动统计工具Appvue和openinstall
android·java·数据库
用户338675581951 小时前
Android 四种常用布局完全解析(附实战项目截图)
android
用户5087532168441 小时前
Android 资源类型全解析:深入理解四种常用布局
android
XiaoLeisj2 小时前
Android 文件存储实战:从应用私有目录读写到网络文件落盘与公共存储接入
android·java·网络·文件操作
恋猫de小郭2 小时前
Android Studio Panda 2 ,支持 AI 用 Vibe Coding 创建项目
android·前端·flutter