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拿到手软!
相关推荐
北京自在科技2 小时前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB13754 小时前
Jetpack Compose 动画Modifier.animateItem()
android
2401_885885045 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往6 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
狂热开发者7 小时前
车载中控要给鸿蒙用户,能不能和 Android 共用一个二维码?
android·华为·harmonyos
.Bryce.7 小时前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
美狐美颜SDK开放平台8 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
2601_968900778 小时前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
好的佩奇019 小时前
Dart 之类修饰符
android·flutter·dart
YB13759 小时前
Jetpack Compose 动画Modifier.animateContentSize()
android