详解Android app自动更新总结(已适配9.0)

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了详解Android app自动更新总结(已适配9.0)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1.配置:

1.1 AndROIdManifest.XMl中添加权限和FilePRovider:

  <uses-PErmission android:name="android.permission.internet"/>  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />   <provider    android:name="androidx.core.content.FileProvider"    android:authorities="com.fengzhi.wuyemanagement.fileprovider"    android:grantUriPermissions="true"    android:exported="false">    <;meta-data     android:name="android.support.FILE_PROVIDER_PATHS"     android:resource="@xML/file_paths" />   </provider>

1.2 新建文件(路径:res/xml/file_paths.xml):

 <paths>  <external-path path="." name="external_storage_root" /> </paths>

1.3 (app的)build.gradle:

  implementation "com.lzy.net:okgo:3.0.4"//okgo 网络请求  implementation 'com.GOOGLE.code.gson:gson:2.8.2'//gson  implementation "org.permissionsdispatcher:permissionsdispatcher:4.3.1"//权限  annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:4.3.1"//权限

2.这里以点击按钮进行更新为例

&nbsp;2.1 核心代码:

  private int version;  /* 更新进度条 */  private ProgressBar mProgress;  private AlertDiaLOG mDownloadDialog;   --------------------------------------------------------------------------------------------------------------------    //点击按钮,检查权限,,,检查更新的方法  @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE,    Manifest.permission.WRITE_EXTERNAL_STORAGE,    Manifest.permission.REQUEST_INSTALL_PACKAGES})  protected void checkUpdate() {   showLoadingDialog("检测更新中...");   version = AppUpdateUtil.getAppversionCode(this);//检查当前版本号 //  调用方法,,,接口的具体实现,接收传过来的参数,再调自己的方法,   requestAppUpdate(version, new DataRequestListener<UpdateAppBean>() {    @override    public void success(UpdateAppBean data) { //    返回的json,getstatus为0时,去下载apk文件,这里是下载apk文件的方法     updateApp(data.getData().getApk_url());    }     @Override    public void fail(String msg) { //    返回的json,getStatus为1时,提示:"已是最新版本!"     SToast(msg);     dismissLoadingDialog();    }   });  }   //检查版本号,第一次请求(post),,,UpdateAppBean根据服务器返回生成  private void requestAppUpdate(int version, final DataRequestListener<UpdateAppBean> listener) {   OkGo.<String>post(Const.HOST_URL + Const.UPDATEAPP).params("version", version).execute(new StringCallback() {    @Override    public void onSuccess(Response<String> 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<String> 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.<File>get(apk_url).tag(this).execute(new FileCallback() {    @Override    public void onSuccess(Response<File> 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<T> {  //请求成功  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配置出错,导致无法安装, 解决办法:

详解Android app自动更新总结(已适配9.0)

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

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

详解Android app自动更新总结(已适配9.0)

android教程
脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的详解Android app自动更新总结(已适配9.0)全部内容,希望文章能够帮你解决详解Android app自动更新总结(已适配9.0)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。