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拿到手软!
相关推荐
花花鱼6 分钟前
html5与android之间相互调用
android
aqi001 小时前
FFmpeg开发笔记(八十八)基于Compose的国产电视直播开源框架MyTV
android·ffmpeg·音视频·直播·流媒体
●VON2 小时前
双非大学生自学鸿蒙5.0零基础入门到项目实战 -《基础篇》
android·华为·harmonyos·鸿蒙
urkay-2 小时前
Android Cursor AI代码编辑器
android·人工智能·编辑器·iphone·androidx
pedestrian_h10 小时前
操作系统-线程
android·java·开发语言
gfdgd xi11 小时前
GXDE 内核管理器 1.0.1——修复bug、支持loong64
android·linux·运维·python·ubuntu·bug
美狐美颜sdk11 小时前
跨平台直播美颜sdk集成攻略:Android、iOS与Web的统一方案
android·前端·ios
❀͜͡傀儡师12 小时前
二维码/条码识别、身份证识别、银行卡识别、车牌识别、图片文字识别、黄图识别、驾驶证(驾照)识别
android·scanner
生莫甲鲁浪戴13 小时前
Android Studio新手开发第三十五天
android·ide·android studio