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拿到手软!
相关推荐
大耳猫4 小时前
主动测量View的宽高
android·ui
帅次6 小时前
Android CoordinatorLayout:打造高效交互界面的利器
android·gradle·android studio·rxjava·android jetpack·androidx·appcompat
枯骨成佛7 小时前
Android中Crash Debug技巧
android
kim565912 小时前
android studio 更改gradle版本方法(备忘)
android·ide·gradle·android studio
咸芝麻鱼12 小时前
Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App
android·ide·android studio
无所谓จุ๊บ12 小时前
Android Studio使用c++编写
android·c++
csucoderlee13 小时前
Android Studio的新界面New UI,怎么切换回老界面
android·ui·android studio
kim565913 小时前
各版本android studio下载地址
android·ide·android studio
饮啦冰美式13 小时前
Android Studio 将项目打包成apk文件
android·ide·android studio
夜色。13 小时前
Unity6 + Android Studio 开发环境搭建【备忘】
android·unity·android studio