版本更新

App一个必要的功能就是 版本更新 ,它有好多种实现方法,比如:腾讯的bugly、蒲公英等,我们也可以自己动手实现。

遇到的坑

bugly:文档上写着默认3s,有时候会延迟弹框十分钟左右,会有一种集成失败的假象。

动手

下面就是我自己写的一种实现方式,调用Android手机原生的下载管理器去下载。

思路

1.网络请求拿到最新版本号

2.获取当前版本号,比较版本号,如果服务器上的版本号比当前版本号大,弹框。

3.点击下载,调用下载工具类传入阿里应用分发平台给的地址。

代码

public class DownloadManagerUtils {
    public static void DownloadManagerUtils(Context context, Uri uri){
        DownloadManager.Request req = new DownloadManager.Request(uri);
        //下载 网络环境
        req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
        req.setVisibleInDownloadsUi(true);
        //通知栏里显示下载过程
        req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        //下载路径
        req.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, "xxx.APK");
        //SD卡路径
//        req.setDestinationInExternalPublicDir("xxx", "xxx.apk");

        // 设置一些基本显示信息
        req.setTitle("xxx.apk");
        req.setDescription("下载完后请点击打开");
        req.setMimeType("application/vnd.android.package-archive");
        // Ok go!
        DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        long downloadId = dm.enqueue(req);

        SharedPreferences sp = context.getSharedPreferences("info",MODE_PRIVATE);
        sp.edit().putLong("downloadId",downloadId).commit();

        DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
        Cursor c = dm.query(query);
        if (c != null) {
            if (c.moveToFirst()) {
                int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
                switch (status){
                    case DownloadManager.STATUS_PENDING:
                        //下载中
                        Toast.makeText(context,"正在更新,请稍等!",Toast.LENGTH_SHORT).show();
                        break;
                    case DownloadManager.STATUS_PAUSED:
                        //暂停中
                        break;
                    case DownloadManager.STATUS_RUNNING:
                        Toast.makeText(context,"正在更新,请稍等!",Toast.LENGTH_SHORT).show();
                        break;
                    case DownloadManager.STATUS_SUCCESSFUL:
                        if(Build.VERSION.SDK_INT>=24){
                            Intent install = new Intent(Intent.ACTION_VIEW);
                            install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
                            install.setDataAndType(dm.getUriForDownloadedFile(downloadId), "application/vnd.android.package-archive");
                            context.startActivity(install);
                        }else{
                            Intent intent = new Intent(Intent.ACTION_VIEW);
                            intent.setDataAndType(dm.getUriForDownloadedFile(downloadId),"application/vnd.android.package-archive");
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            context.startActivity(intent);
                        }

                        //下载完成
                        break;
                    case DownloadManager.STATUS_FAILED:
                        //下载失败
                        break;
                }
            }
            c.close();
        }
    }
}

效果

马马虎虎 希望可以帮助到您!

 

你可能感兴趣的:(版本更新)