精华内容
下载资源
问答
  • Android版本升级

    2017-05-24 10:36:20
    快速实现Android版本升级的Demo,详情请看http://blog.csdn.net/a1533588867/article/details/72650244
  • android 版本升级

    2019-10-11 16:07:55
    在app上面有一个版本升级的功能,我们在服务器上传了新的安装包之后,就可以点击更新版本去拿到服务器上面的新包并更新 拿到当前版本的版本号: /** * 拿到versionName * * @return */ public String ...

    在app上面有一个版本升级的功能,我们在服务器上传了新的安装包之后,就可以点击更新版本去拿到服务器上面的新包并更新

    拿到当前版本的版本号:

    /**
         * 拿到versionName
         *
         * @return
         */
        public String getPackageVersionName() {
            //1.PackageManager 包的管理者对象
            PackageManager pm = getPackageManager();
            //2.获取应用的配置信息,在此处传递0获取的是基本信息(包名,版本名称,版本号)
            try {
                PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
                String versionName = packageInfo.versionName;
                return versionName;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return "";
        }
        /**
         * 拿到versionCode
         *
         * @return
         */
        public int getPackageVersionCode() {
            //1.PackageManager 包的管理者对象
            PackageManager pm = getPackageManager();
            //2.获取应用的配置信息,在此处传递0获取的是基本信息(包名,版本名称,版本号)
            try {
                PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
                int versionCode = packageInfo.versionCode;
                return versionCode;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return 0;
        }
    

    发送请求,拿到新版本的相关信息:

    /**
         * 请求服务器拿到新的app版本的相关信息
         *
         * @param updateURL
         */
        private void getNewPackInfro(final String updateURL) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
                        Request request = new Request.Builder()
                                .url(updateURL)//请求接口。如果需要传参拼接到接口后面。
                                .build();//创建Request 对象
                        Response response = null;
                        response = client.newCall(request).execute();//得到Response 对象
                        if (response.isSuccessful()) {
                            if (response.code() == 200) {
                                String res = null;
                                try {
                                    res = response.body().string();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                checkVersion(res);
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
    private void checkVersion(String res) {
            //拿到服务器返回的相关数据
            //进行版本比较是否进行升级
            System.out.println("返回的升级包数据:"+res);
            try {
                JSONObject jsonObject = new JSONObject(res);
                JSONObject dataStr=new JSONObject(jsonObject.getString("data"));
                String version=null;
                version=dataStr.getString("version");
                if(version.equals("null")){
                    Toast.makeText(getBaseContext(), "当前已经是最新版本了", Toast.LENGTH_SHORT).show();
                }else{
                    downloadUrl=dataStr.getString("url");
                    //服务器有新版本,可供下载
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            showDialog();
                        }
                    });
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    

    弹出是否下载新版本的提示:

     /**
         * 检查更新版本时的消息提示
         */
        private void showDialog() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
    //        builder.setTitle("是否下载新版本?");
            builder.setMessage("是否下载新版本");//设置对话框除标题外的描述内容
            builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    //下载apk,下载路径downloadUrl,考虑在何处存储 files cache() sd卡
                    downloadApk();
                }
            });
            builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    //什么都不做
                }
            });
            builder.setCancelable(false);
            builder.show();
    
        }
    

    显示下载安装包的进度:

    /**
         * 下载新的apk文件
         */
        private void downloadApk() {
            //下载apk,并且指定放置下载文件的路径,sd卡
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                //创建一个进度条对话框,用于显示下载进度
                progressDialog = new ProgressDialog(this);
                //默认情况下对话框进度条圆形转圈的
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.setCancelable(false);
                progressDialog.show();
                //手机的sd卡可用
                //sd卡存储文件的路径
                final String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "jizhixinxi/package" + "mobilesafe.apk";
                //如何根据downloadUrl进行下载,okhttp下载
                OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).build();
                Request request = new Request.Builder().get().url(downloadUrl).build();
                okHttpClient.newCall(request).enqueue(new Callback() {
    
                    @Override
                    public void onFailure(Call call, IOException e) {
                        //请求失败
                        Toast.makeText(SystemConfigActivity.this, "下载新版本失败请稍后重试", Toast.LENGTH_SHORT).show();
                        progressDialog.dismiss();
                    }
    
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //请求成功,从服务器的响应对象中获取apk,流(服务器 输入流(提供数据)  本地 输出流(写入文件))
                        ResponseBody body = response.body();
                        //告知progressDialog总进度,不变
                        progressDialog.setMax((int) body.contentLength());
                        //inputStream就是服务器把需要下载的apk以流的形式提供给客户端
                        InputStream inputStream = body.byteStream();
                        File file = new File(path);
                        FileOutputStream fos = new FileOutputStream(file);
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        int temp = 0;//用于记录目前下载的到的位置
                        while ((len = inputStream.read(bytes)) != -1) {
                            //将读过的数据写入文件中
                            fos.write(bytes, 0, len);
                            //告知progressDialog在下载过程中的当前进度
                            temp += len;
                            //将当前的下载位置,设置给progressDialog
                            progressDialog.setProgress(temp);
                            //没下载一段数据,睡眠一段时间
                            try {
                                Thread.sleep(1);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        //一旦循环结束,则sd卡中就有一个从服务器下载下来的apk
                        //下载完成后,则隐藏对话框
                        progressDialog.dismiss();
                        //安装apk,这个要装的apk在哪里
                        installApk(file);
                    }
                });
            }
        }
    

    让系统帮我们安装:

     /**
         * 安装指定路径下的apk
         *
         * @param file 需要安装文件的路径
         */
        private void installApk(File file) {
            //找到系统的安装界面,把安装过程中要用到的东西传递进去,让系统帮助我们安装.
            Intent intent = new Intent("android.intent.action.VIEW");
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            //通过隐式意图开启系统的安装apk界面
            startActivity(intent);
        }
    
    展开全文
  • Android 版本升级

    2017-02-03 17:23:58
    在应用中, 版本升级是每个应用都需要做的功能, 下面介绍下主要代码.首先每次进入应用判断版本号与后台设置是否一致, 不一致即提示用户升级更新.为适配Android6.0加入运行时权限. 添加代码 if (ContextCompat....
    在应用中, 版本升级是每个应用都需要做的功能, 下面介绍下主要代码.
    
    首先每次进入应用判断版本号与后台设置是否一致, 不一致即提示用户升级更新.为适配Android6.0加入运行时权限. 添加代码
    
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                                    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    
                                ActivityCompat.requestPermissions(MainActivity.this,
                                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
                            } else {
                            //这里表示以允许写入权限,  
                            //这里写下载apk的代码
                            }

    如果检测为开通权限, 则会出提示框提示开通, 回调的代码

     @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              //这里写下载apk的代码
            }
    
        }

    下面是如何下载apk

    private NotificationManager notificationManager;
    private Notification notification;
    RemoteViews view = null;
    
    private void downloadApk(final String url) {
            new EasyLocalTask<Void, File>() {
    
                @Override
                protected File doInBackground(Void... params) {
                    File file = new File(CheLiWangApp.CACHE_ROOT_CACHE_DIR + File.separator + CheLiWangConfig.APK_NAME);
                    try {
                        LogUtil.e(url);
                        notification();
    
                        HttpUtil.downloadFile(url, file, new HttpUtil.IDownloadCallback() {
    
                            int i = 0;
    
                            @Override
                            public void onProgress(long currentSize, long totalSize) {
    
                                progress = (int) (((float) currentSize / totalSize) * 100);
    
                                if ((int) (progress / 10) > i) {
                                    i = (int) (progress / 10);
                                    // 更改进度条
                                    notification.contentView.setProgressBar(R.id.progress, (int) (totalSize / 1024 / 1000),
                                            (int) (currentSize / 1024 / 1000), false);
                                    // 发送消息
                                    notificationManager.notify(101, notification);
                                }
                            }
                        });
                        // HttpUtil.downloadFile(url, file);
                    } catch (IOException e) {
                        file = null;
                    }
    
                    return file;
                }
    
                @Override
                protected void onPostExecute(File result) {
                    super.onPostExecute(result);
                    if (result != null) {
                        notificationManager.cancel(101);// notification关闭不显示
                        install(MainActivity.this, result);
                    }
                }
            }.execute();
        }
    
    
     private void notification() {
          notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
          notification = new Notification(R.drawable.ic_launcher, "下载新版本", System.currentTimeMillis());
    
            if (view == null) {
                view = new RemoteViews(getPackageName(), R.layout.notification);
                notification.contentView = view;
                notification.contentView.setProgressBar(R.id.progress, 100, 0, false);
            }
            PendingIntent contentIntent = PendingIntent.getActivity(this, R.string.app_name, new Intent(),
                    PendingIntent.FLAG_UPDATE_CURRENT);
            notification.contentIntent = contentIntent;
            notification.flags |= Notification.FLAG_ONGOING_EVENT;// 滑动或者clear都不会清空
    
            notificationManager.notify(101, notification);
        }

    下面是安装apk的代码, 适配Android7.0, 解决7.0安装下载好的apk闪退bug
    首先需在manifest中application 中加上

    <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="com.clwapp.test.fileprovider"
                android:grantUriPermissions="true"
                android:exported="false">
                <!--元数据-->
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
            </provider>

    并在res目录下新建文件夹xml文件夹, 创建file_paths.xml文件
    写入代码

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths>
            <external-path
                name="download"
                path=""/>
        </paths>
    </resources>
    

    在MainActivity 中调用安装方法

    public void install(Context context, File file) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            // 由于没有在Activity环境下启动Activity,设置下面的标签
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上
                //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
                Uri apkUri =
                        FileProvider.getUriForFile(context, "com.clwapp.test.fileprovider", file);
                //添加这一句表示对目标应用临时授权该Uri所代表的文件
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
            } else {
                intent.setDataAndType(Uri.fromFile(file),
                        "application/vnd.android.package-archive");
            }
            context.startActivity(intent);
        }
    展开全文
  • android版本升级

    2016-09-23 14:53:46
    http://blog.csdn.net/harvic880925/article/details/25191159
    展开全文
  • 博主今天比较闲,来看看关于android版本升级的相关知识吧。作为码农,如果不知道升级版本,那就比较low了。1.相关了解 检测当前版本的信息AndroidManifest.xml–>manifest–>Android:versionName。 2.自动检测...

    博主今天比较闲,来看看关于android 的版本升级的相关知识吧。作为码农,如果不知道升级版本,那就比较low了。

    1.相关了解

    • 检测当前版本的信息AndroidManifest.xml–>manifest–>Android:versionName。

    2.自动检测版本升级(参考博客)

    3.注意点

    AndeoidManifest中设置了版本号,但是build.gradle中也设置了。

    展开全文
  • android版本升级完整代码

    热门讨论 2012-07-09 16:30:42
    android软件的版本升级,自动检测版本号,并提示升级信息!
  • 我在旧版本中写了一个广播,在新版本里这个广播不要删除了,覆盖安装新版本后,会有旧广播发出,然后就会报java.lang.RuntimeException: Unable to instantiate receiver ...
  • 本文档主要介绍OTA相关方向的介绍,通过本文档可快速了解RK3399平台android镜像版本升级的两种方式OTA 本地升级、OTA远程升级以及OTA升级包编译过程。 飞凌RK3399开发板 OTA测试 OTA (over the air)升级是...
  • 小白成长中碰到的版本升级问题~~
  • 同样的App在安卓4.2平板上运行正常,但在android 5.1平板上运行时,前面几十秒可以正常接收数据,然后就突然收不到数据了,调试发现异常是recv函数返回-1,异常内容为:Connection timed out。此时可以正常向服务器...
  • android 版本升级时,so变化

    千次阅读 2015-11-02 18:34:13
    4.2以下,so的目录为data/data...在app版本升级的时候,只有在4.2以上的,才会把旧版本有,新版本没有 的SO 删除。! 否则so还是在哪个目录下面  看图---------这个测试,是通过应用直接eclipse运行, 然后删除so
  • * @Description: 跟服务器版本比对,是否需要更新 * @Params version_Service 服务器最新APP版本号 */ public static boolean isNeedUpdate(Context context,String version_service){ boolean isNeed = false; ...
  • RN 开发中android 版本升级步骤

    千次阅读 2017-06-07 22:13:09
    版本发完,遇到的问题 版本迭代中package.json 文件中 "dependencies": { "@ctrip/crn": "git+http://wirelesscode.ctripcorp.com/crn#rel/7.5", "@ctrip/crn_ext":"git+...
  • public static int compareVersion(String version1, String version2) { if (version1.equals(version2)) { return 0; } String[] version1Array = version1.split("\\."); String[] vers
  • 调查发现闪退的应用都在首屏加载了webview,而在android p上webview的渲染是在另外一个进程上进行的,进程名字类似webview:sandboxed_process0,这个进程是由webview_zygote这样一个进程fork出来的,而webview_...
  • Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。 SQLite提供了ALTER TABLE命令,允许用户重命名或...
  • 将手机上应用版本号等相关信息发送到服务器,服务器检测是否有新版本。如果有新版本,将返回客户端版本号、版本名称、下载地址、版本更新说明等信息。客户端获取到此信息后,将询问用户是否下载,确定后,开始下载。...
  • http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html ... ...做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,
  • 1.数据库如果有改动,则版本号要进行更新 2.如果低版本sp中存放的数据格式与新版本相同sp中存放的数据格式不一致,则需要兼顾覆盖低版本安装的问题 不定期更新
  • 今天做了一个android版本升级,从服务器上面下载下来的apk总是在安装的时候 报解析失败,包不能解析。  开始找问题,发现 下载下来的文件和实际服务器中的文件大小不一致。 这应该就是问题的根源了。 我以前的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,734
精华内容 3,493
关键字:

android版本升级