精华内容
下载资源
问答
  • Android版本更新

    2019-05-05 14:57:40
    应用程序的版本更新总结 先上两张效果图 /** * Created by ... * Android版本更新 */ public class UpdateManager { private Context mContext; //上下文 private String apkUrl = "apk下载地址...

    应用程序的版本更新总结

    先上两张效果图

              

    /**
     * Created by WangJinyong on 2019/5/5.
     * Android版本更新
     */
    
    public class UpdateManager {
        private Context mContext; //上下文
    
        private String apkUrl = "apk下载地址"; //apk下载地址
        private static final String savePath = "/sdcard/updateAPK/"; //apk保存到SD卡的路径
        private static final String saveFileName = savePath + "apkName.apk"; //完整路径名
    
        private ProgressBar mProgress; //下载进度条控件
        private TextView tv_progress;//下载进度百分比
        private static final int DOWNLOADING = 1; //表示正在下载
        private static final int DOWNLOADED = 2; //下载完毕
        private static final int DOWNLOAD_FAILED = 3; //下载失败
        private int progress; //下载进度
        private boolean cancelFlag = false; //取消下载标志位
    
        //    private double serverVersion = 2.0; //从服务器获取的版本号
    //    private double clientVersion = 1.0; //客户端当前的版本号
        private String updateDescription = "更新描述"; //更新内容描述信息
        private boolean forceUpdate = false; //是否强制更新
    
        private AlertDialog alertDialog1, alertDialog2; //表示提示对话框、进度条对话框
    
        /**
         * 构造函数
         */
        public UpdateManager(Context context) {
            this.mContext = context;
        }
    
        /**
         * 显示更新对话框
         */
        public void showNoticeDialog(double serverVersion, double clientVersion) {
            //如果版本最新,则不需要更新
            if (serverVersion <= clientVersion)
                return;
            AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
            dialog.setTitle("发现新版本 :" + serverVersion);
            dialog.setMessage(updateDescription + CommonTools.getAppVersionName(mContext));
            dialog.setPositiveButton("现在更新", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    arg0.dismiss();
                    showDownloadDialog();
                }
            });
            //是否强制更新
            if (forceUpdate == false) {
                dialog.setNegativeButton("待会更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        arg0.dismiss();
                    }
                });
            }
            alertDialog1 = dialog.create();
            alertDialog1.setCancelable(false);
            alertDialog1.show();
        }
    
        /**
         * 显示进度条对话框
         */
        public void showDownloadDialog() {
            AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
            dialog.setTitle("正在更新");
            final LayoutInflater inflater = LayoutInflater.from(mContext);
            View v = inflater.inflate(R.layout.update_progress, null);
            mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
            tv_progress = (TextView) v.findViewById(R.id.tv_progress);
            dialog.setView(v);
            //如果是强制更新,则不显示取消按钮
            if (forceUpdate == false) {
                dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        arg0.dismiss();
                        cancelFlag = false;
                    }
                });
            }
            alertDialog2 = dialog.create();
            alertDialog2.setCancelable(false);
            alertDialog2.show();
    
            //下载apk
            downloadAPK();
        }
    
        /**
         * 下载apk的线程
         */
        public void downloadAPK() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        URL url = new URL(apkUrl);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.connect();
    
                        int length = conn.getContentLength();
                        InputStream is = conn.getInputStream();
    
                        File file = new File(savePath);
                        if (!file.exists()) {
                            file.mkdir();
                        }
                        String apkFile = saveFileName;
                        File ApkFile = new File(apkFile);
                        FileOutputStream fos = new FileOutputStream(ApkFile);
    
                        int count = 0;
                        byte buf[] = new byte[1024];
    
                        do {
                            int numread = is.read(buf);
                            count += numread;
                            progress = (int) (((float) count / length) * 100);
                            //更新进度
                            mHandler.sendEmptyMessage(DOWNLOADING);
                            if (numread <= 0) {
                                //下载完成通知安装
                                mHandler.sendEmptyMessage(DOWNLOADED);
                                break;
                            }
                            fos.write(buf, 0, numread);
                        } while (!cancelFlag); //点击取消就停止下载.
    
                        fos.close();
                        is.close();
                    } catch (Exception e) {
                        mHandler.sendEmptyMessage(DOWNLOAD_FAILED);
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        /**
         * 更新UI的handler
         */
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case DOWNLOADING:
                        mProgress.setProgress(progress);
                        tv_progress.setText(progress + "%");//显示下载进度百分比
                        break;
                    case DOWNLOADED:
                        if (alertDialog2 != null)
                            alertDialog2.dismiss();
                        installAPK();
                        break;
                    case DOWNLOAD_FAILED:
                        Toast.makeText(mContext, "网络断开,请稍候再试", Toast.LENGTH_LONG).show();
                        break;
                    default:
                        break;
                }
            }
        };
    
        /**
         * 下载完成后自动安装apk
         */
        public void installAPK() {
            File apkFile = new File(saveFileName);
            if (!apkFile.exists()) {
                return;
            }
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");
            mContext.startActivity(intent);
        }

    布局文件update_progress.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ProgressBar
            android:id="@+id/update_progress"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"/>
        <TextView
            android:id="@+id/tv_progress"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:paddingRight="15dp"
            android:text="0%"
            android:textColor="@color/black"
            android:textSize="@dimen/textsize_sp_14"
            />
    
    </LinearLayout>

    获取当前版本号和应用名称的方法

    /**
         * 获取当前app version code
         */
        public static long getAppVersionCode(Context context) {
            long appVersionCode = 0;
            try {
                PackageInfo packageInfo = context.getApplicationContext()
                        .getPackageManager()
                        .getPackageInfo(context.getPackageName(), 0);
                appVersionCode = packageInfo.versionCode;
            } catch (PackageManager.NameNotFoundException e) {
                Logger.e("CommonTools", e.getMessage());
            }
            return appVersionCode;
        }
    
        /**
         * 获取当前app version name
         */
        public static String getAppVersionName(Context context) {
            String appVersionName = "";
            try {
                PackageInfo packageInfo = context.getApplicationContext()
                        .getPackageManager()
                        .getPackageInfo(context.getPackageName(), 0);
                appVersionName = packageInfo.versionName;
            } catch (PackageManager.NameNotFoundException e) {
                Logger.e("CommonTools", e.getMessage());
            }
            return appVersionName;
        }

    版本更新使用方法:

    UpdateManager mUpdateManager = new UpdateManager(this);
    mUpdateManager.showNoticeDialog(2.0,CommonTools.getAppVersionCode(this));

     

    展开全文
  • Android 版本更新

    千次阅读 2021-04-07 09:13:36
    教你快速集成版本更新 第一步引入updateapputils依赖包 implementation 'com.teprinciple:updateapputils:1.2' 第二步快速更新 UpdateAppUtils.from(this) .serverVersionCode(2) //服务器versionCode ....

    教你快速集成版本更新

    第一步引入updateapputils依赖包

    implementation 'com.teprinciple:updateapputils:1.2'
    

    第二步快速更新

     UpdateAppUtils.from(this)
                    .serverVersionCode(2)  //服务器versionCode
                    .serverVersionName("2.0") //服务器versionName
                    .apkPath(apkPath) //最新apk下载地址
                    .update();
    

    更多配置使用

    UpdateAppUtils.from(this)
                    .checkBy(UpdateAppUtils.CHECK_BY_VERSION_CODE) //更新检测方式,默认为VersionCode
                    .serverVersionCode(2)
                    .serverVersionName("2.0")
                    .apkPath(apkPath)
                    .downloadBy(UpdateAppUtils.DOWNLOAD_BY_BROWSER) //下载方式:app下载、手机浏览器下载。默认app下载
                    .isForce(true) //是否强制更新,默认false 强制更新情况下用户不同意更新则不能使用app
                    .update();
    

    关于适配ANDROID6.0、ANDROID7.0

    1、在AndroidManifest.xml中 注册provider

        <provider
                android:name=".utils.ImageFileProvider"  //创建一个类继承FileProvider就OK了 
                android:authorities="${applicationId}.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true"
                tools:replace="android:authorities">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
            </provider>
    

    2、在 res文件下创建一个xml文件里新建file_paths.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>
    
    展开全文
  • android版本更新

    千次阅读 2016-09-13 13:18:59
    版本更新,估计现在大多数app都需要这样的功能,感觉以前写的比较繁琐,正好这次app需要添加这个功能,就想找个比较简单的方法实现; 众所周知,版本更新大致需要三步走: 第一步:获取当前版本号和服务器版本号 ...


    版本更新,估计现在大多数app都需要这样的功能,感觉以前写的比较繁琐,正好这次app需要添加这个功能,就想找个比较简单的方法实现;


    众所周知,版本更新大致需要三步走:
    第一步:获取当前版本号和服务器版本号
    第二步:对比两个版本号是否相同,相同进入主页面,不相同弹出更新对话框
    第三部:下载apk


    繁琐就繁琐到第三步,在网上看了好多demo,几乎都是两年前的demo,所以比较繁琐,今天我们用一个工具类,两行代码搞定;

    第一步:获取当前版本号和服务器版本号

    //获得当前版本号
            versionCode = AppUtils.getVersionCode(this);
    
            //假设我们在子线程联网后获取服务器版本号和版本名称(真是项目中都是从服务器获取的)
            int updateCode = 3;
            updateName = "更新免费送英雄,皮肤活动!";

    第二步:对比版本号,弹出更新对话框

    //然后判断服务器版本号是否和当前版本号一样
            if (updateCode == versionCode) {//发送一个handler进入主页面
                handler.sendEmptyMessage(GO_HOME);
            } else {//弹出对话框提示更新
                handler.sendEmptyMessage(SHOW_DIALOG);
            }
    弹出对话框:

        private void showUpdateDialog() {
            //弹出对话框提示更新
            AlertDialog.Builder adb = new AlertDialog.Builder(SplashActivity.this);
            adb.setTitle("发现新版本");
            adb.setMessage(updateName);
    
            adb.setCancelable(false);//要么点击确定,要么点击取消。否则不会关闭dialog
    
            adb.setNegativeButton("确定", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    //下载更新的APK
                    downUpdateAPK();
                }
            });
            adb.setPositiveButton("取消", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    //点击取消进入主页面
                    handler.sendEmptyMessage(GO_HOME);
                }
            });
            adb.show();
        }
    最重要最繁琐的一步就是下载apk,我们这里直接使用的工具类UpdateManage,直接拉倒项目中即可使用(最低端有源码下载地址);

    使用步骤:

    UpdateManage updateManage = new UpdateManage(SplashActivity.this, "http://app.192.168.1.100.com/yzsc.apk");
            updateManage.showDownloadDialog();
    直接将http://app.192.168.1.100.com/yzsc.apk更改为你们的apk下载路径即可;

    demo下载号不要直接运行,我这个apk下载地址是内网的,直接运行没有效果;先把apk下载路径更改以后再运行;




    点击打开链接免费下载源码


    展开全文
  • android版本更新 demo

    热门讨论 2018-02-02 14:40:52
    android版本更新 demo 版本更新 系统更新 自动升级
  • Android版本更新

    千次阅读 2018-04-28 16:43:38
    Android版本更新库 转载自GitHub地址:https://github.com/AlexLiuSheng/CheckVersionLib 任何地方都可以调用 简单简单简单简单 扩展性强大 更强大的自定义界面支持 支持强制更新(一行代码) 支持静默下载 (一...

    Android版本更新库

    转载自GitHub地址:https://github.com/AlexLiuSheng/CheckVersionLib

    • 任何地方都可以调用
    • 简单简单简单简单
    • 扩展性强大
    • 更强大的自定义界面支持
    • 支持强制更新(一行代码)
    • 支持静默下载 (一行代码)
    • 适配到Android O

    导入

    compile ‘com.allenliu.versionchecklib:library:2.0.3’

    使用

    请求版本一些其他的http参数可以设置,如下

     AllenVersionChecker
                .getInstance()
                .requestVersion()
                .setHttpHeaders(httpHeader)
                .setRequestMethod(HttpRequestMethod.POSTJSON)
                .setRequestParams(httpParam)
                .setRequestUrl(requestUrl)
                .request(new RequestVersionListener() {
                    @Nullable
                    @Override
                    public UIData onRequestVersionSuccess(String result) {
                        //拿到服务器返回的数据,解析,拿到downloadUrl和一些其他的UI数据
                        ...
                        UIData uiData = UIData
                                .create()
                                .setDownloadUrl(downloadUrl)
                                .setTitle(updateTitle)
                                .setContent(updateContent);
                        //放一些其他的UI参数,拿到后面自定义界面使用
                        uiData.getVersionBundle().putString("key", "your value");
                        return uiData;
    
                    }
    
                    @Override
                    public void onRequestVersionFailure(String message) {
    
                    }
                })
                .excuteMission(context);
    

    一些其他的function设置

    解释下,下面的builder叫DownloadBuilder

     DownloadBuilder builder=AllenVersionChecker
                .getInstance()
                .downloadOnly();
    
      or          
    
     DownloadBuilder builder=AllenVersionChecker
                 .getInstance()
                 .requestVersion()
                 .request()
    

    取消任务

    AllenVersionChecker.getInstance().cancelAllMission(this);
    

    静默下载

     builder.setSilentDownload(true); 默认false
    

    强制更新

    设置此listener即代表需要强制更新,会在用户想要取消下载的时候回调 需要你自己关闭所有界面

    builder.setForceUpdateListener(() -> {
              forceUpdate();
          });
    

    下载忽略本地缓存

    如果本地有安装包缓存也会重新下载apk

     builder.setForceRedownload(true); 默认false
    

    是否显示下载对话框

    builder.setShowDownloadingDialog(false); 默认true
    

    是否显示通知栏

    builder.setShowNotification(false);  默认true
    

    自定义通知栏

          builder.setNotificationBuilder(
                 NotificationBuilder.create()
                         .setRingtone(true)
                         .setIcon(R.mipmap.dialog4)
                         .setTicker("custom_ticker")
                         .setContentTitle("custom title")
                         .setContentText(getString(R.string.custom_content_text))
         );
    

    是否显示失败对话框

      builder.setShowDownloadFailDialog(false); 默认true
    

    自定义下载路径

      builder.setDownloadAPKPath(address); 默认:/storage/emulated/0/AllenVersionPath/
    

    可以设置下载监听

     builder.setApkDownloadListener(new APKDownloadListener() {
             @Override
             public void onDownloading(int progress) {
    
             }
    
             @Override
             public void onDownloadSuccess(File file) {
    
             }
    
             @Override
             public void onDownloadFail() {
    
             }
         });
    

    自定义界面

    自定义界面使用回调方式,开发者需要返回自己定义的Dialog(父类android.app)

    • 所有自定义的界面必须使用listener里面的context实例化

    • 界面展示的数据通过UIData拿

    自定义显示更新界面

    设置 CustomVersionDialogListener

    • 定义此界面必须有一个确定下载的按钮,按钮id必须为@id/versionchecklib_version_dialog_commit
    • 如果有取消按钮(没有忽略本条要求),则按钮id必须为@id/versionchecklib_version_dialog_cancel

       builder.setCustomVersionDialogListener((context, versionBundle) -> {
          BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, R.layout.custom_dialog_one_layout);
          //versionBundle 就是UIData,之前开发者传入的,在这里可以拿出UI数据并展示
          TextView textView = baseDialog.findViewById(R.id.tv_msg);
          textView.setText(versionBundle.getContent());
          return baseDialog;
      });
      

    自定义下载中对话框界面

    设置CustomDownloadingDialogListener

    • 如果此界面要设计取消操作(没有忽略),请务必将id设置为@id/versionchecklib_loading_dialog_cancel

       builder.setCustomDownloadingDialogListener(new CustomDownloadingDialogListener() {
          @Override
          public Dialog getCustomDownloadingDialog(Context context, int progress, UIData versionBundle) {
              BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, R.layout.custom_download_layout);
              return baseDialog;
          }
      //下载中会不断回调updateUI方法
          @Override
          public void updateUI(Dialog dialog, int progress, UIData versionBundle) {
              TextView tvProgress = dialog.findViewById(R.id.tv_progress);
              ProgressBar progressBar = dialog.findViewById(R.id.pb);
              progressBar.setProgress(progress);
              tvProgress.setText(getString(R.string.versionchecklib_progress, progress));
          }
      });
      

    自定义下载失败对话框

    设置CustomDownloadFailedListener

    • 如果有重试按钮请将id设置为@id/versionchecklib_failed_dialog_retry
    • 如果有 确认/取消按钮请将id设置为@id/versionchecklib_failed_dialog_cancel

         builder.setCustomDownloadFailedListener((context, versionBundle) -> {
          BaseDialog baseDialog = new BaseDialog(context, R.style.BaseDialog, R.layout.custom_download_failed_dialog);
          return baseDialog;
      });
      
    展开全文
  • Android版本更新升级

    千次阅读 2017-01-22 16:37:43
    本文我将简要介绍一下Android版本更新的相关知识。 一、知识预热 1.versionCode:版本号,Int类型,版本升级主要是根据versionCode的大小比较进行更新操作,如服务器的版本大于当前APP版本,即可进行更新操作,...
  • android 版本更新功能

    2016-12-21 16:01:28
    Android 版本更新的功能  效果图如下: github地址  https://github.com/smartTop/VersionUpdate  欢迎大家指正,别忘了点赞啊
  • AppUpdate 项目地址:azhon/AppUpdate  简介:一个 Android 版本更新的库、A Android version update library
  • Android版本更新 借鉴: Android版本更新知识(检测、升级)总结 先说遇到的问题,7.0,8.0及以上版本采用旧方法更新,首先无法安装,添加响应权限之后,更新包安装之后,点击打开图标,应用无反应,点击图标打开正常...
  • Android版本更新知识(检测、升级)总结

    万次阅读 多人点赞 2017-03-14 16:19:39
    Android版本更新知识(检测、升级)总结 本文对Android版本更新的知识做全面的总结,主要包括开发中版本的设置,如何检测本程序的版本,版本的更新判断和显示,新版本程序的安装。一.版本的基础知识 版本控制的...
  • 一个轻量级、高可用性的 Android 版本更新框架 更多:作者提 Bug官网 标签: 一个轻量级、高可用性的 Android 版本更新框架。赶紧点击使用说明文档,体验一下吧! 在提 issue 前,请先阅读【提问的智慧】,...
  • Android 版本更新安装apk

    千次阅读 2019-04-02 10:27:49
    版本更新是每个安卓应用都会涉及的,当有新的版本更新下载后,调用系统安装程序安装新的apk,targetSdkVersion 在7.0以下时我们直接使用以下代码: /** * 安装apk * * @param context * @param path 本地...
  • android版本更新功能

    万次阅读 多人点赞 2016-05-20 11:22:28
    1、检测是否有新版本 //访问服务器是否有新版本发布 UpdateVersionUtil.... //设置版本更新的回调接口 UpdateVersionUtil.setUpdateListener(new UpdateListener() { @Override public void onUpdateReturn
  • Android版本更新迭代

    2018-04-15 20:37:28
    版本迭代更新 3.判断是否是第一次进入这个程序(是第一次的有欢迎页,不是第一次进入的话没有欢迎页面) 版本迭代更新1.进入欢迎页面,请求服务器获取服务器中的数据(app信息)2.解析服务器返回的数据,获取信息...
  • Android版本更新、热更新》系列课程视频 版本更新6.0,7.0统统搞定!! 热修复不在麻烦,再也不用担心上线后出bug!! http://edu.csdn.net/course/play/6523/131198...
  • android版本更新完整版

    热门讨论 2016-05-20 12:43:44
    支持断点下载,根据网络情况选择下载,自动安装,支持本地和网络测试

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,310
精华内容 6,124
关键字:

android版本更新