APP版本升级与服务器交互

踏入程序媛旅程已经快一年了,学生生涯也即将结束,正式踏入工作岗位。万事开头难,只能多问多记,久病成医,遇到的问题多了自己的技术也会有所提高。博客也一年了,之前一直想写博,然后各种拖延,到现在才开始,希望自己能坚持。
项目中加了一个APP版本升级功能。之前写的版本升级是由第三方蒲公英版本更新来做。这次由于后台并没有给相应接口(比较坑),然后让我这只菜鸟自己去写服务端接口(真是恐慌呀!),经过各种debug,总算over。


目录

IIS

iis是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。IIS是一种Web(网页)服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。

IIS配置

因为只是app的版本升级,需要将apk放在服务器中然后供客户下载,IIS里的MIME里默认是不支持的。如果没有配置MIME时,直接输入网址要下载APK文件时,会提示找不到此文件。这里教你如何配置IIS的MIME设置,使其可以支持APK文件的下载。。所以本文只涉及到.apk和.json。
打开IIS管理器(快捷方式:inetmgr),找到项目的网站
这里写图片描述
双击之后会在右边看到该网站的所有功能配置,我们选择并点击进入“MIME类型”,在右侧选择“添加”
这里写图片描述
之后在弹出的添加窗口里的文件扩展名输入:.apk
在MIME类型输入:application/vnd.android.package-archive
按确定。
这里写图片描述
点击确定之后会在MIME类型中看到.apk;IIS支持.json文件也是同样的步骤
这里写图片描述
这样需要的IIS就配置完成了,在浏览器中就可以访问到自己写的json文件和apk了。

写json文件

由于只是app的版本更新不需要数据库与代码逻辑。在IIS管理器中找到自己项目的网站,右键“浏览”,进入到项目的接口文件中,随便新建一个文件夹,在这里叫“update”,里面放入你的apk,再新建一个以.json为后缀名的文本
这里写图片描述
然后在update.json文本中写json(按照json格式,看bejson能校验通过吗)
内容可以自己随意添加。其中downloadURL的value值是存放的.apk的路径,当然localhost要用IP地址代替“http://x.x.x.:端口号/路径”

代码块

{
"versionName":"1.0",
"versionDes":"更新描述",
"versionCode":"1",
"downloadURL":"http://x.x.x.x:port/uploadeapp/app-release.apk"
}

Android端

访问网络解析json

URL url = new URL(update的路径);
                    //打开url
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    //请求超时
                    connection.setConnectTimeout(5000);
                    //读取超时
                    connection.setReadTimeout(5000);
                    //获取请求成功响应码
                    if (connection.getResponseCode() == 200) {
                        InputStream is = connection.getInputStream();
                        String json = StreamUtil.streamtoString(is);
                        JSONObject jsonObject = new JSONObject(json);
                        mVersionName = jsonObject.getString("versionName");
                        mVersionDes = jsonObject.getString("versionDes");
                        mVersionCode = jsonObject.getString("versionCode");
                        mDownloadURL = jsonObject.getString("downloadURL");
                        if (Integer.parseInt(mVersionCode) > mVersionsCode) {
                             downloadAPK();

                        } else {
                           //根据需求自己处理

                        }
 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                final String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "phoneGuardian.apk";
                pBar = new ProgressDialog(WelcomeActivity.this);
     pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                pBar.setCancelable(false);
                pBar.setTitle("正在下载...");
                pBar.setMessage("请稍候...");
                pBar.setProgress(0);
                pBar.show();
                new Thread() {
                    public void run() {
                        try {
                            URL url = new URL(mDownloadURL);
                            HttpURLConnection con = (HttpURLConnection) url.openConnection();
                            con.setReadTimeout(5000);
                            con.setConnectTimeout(5000);
                            con.setRequestProperty("Charset", "UTF-8");
                            con.setRequestMethod("GET");
                            if (con.getResponseCode() == 200) {
                                int length = con.getContentLength();// 获取文件大小
                                InputStream is = con.getInputStream();
                                pBar.setMax(length); // 设置进度条的总长度
                                FileOutputStream fileOutputStream = null;
                                if (is != null) {
                                    //对apk进行保存
                                    result = new File(path);
                                    if (!result.exists()) {
                                        result.createNewFile();
                                    }
                                    fileOutputStream = new FileOutputStream(result);
                                    byte[] buf = new byte[1024];
                                    int ch;
                                    int process = 0;
                                    while ((ch = is.read(buf)) != -1) {
                                        fileOutputStream.write(buf, 0, ch);
                                        process += ch;
                                        pBar.setProgress(process); // 实时更新进度了
                                    }
                                }
                                if (fileOutputStream != null) {
                                    fileOutputStream.flush();
                                    fileOutputStream.close();
                                }
                                //apk下载完成,安装apk
                                Toast.makeText(WelcomeActivity.this, "下载成功", Toast.LENGTH_SHORT).show();
                                pBar.dismiss();
                                File file = result;//apk路径
                                installapk(file);

                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                }.start();

遇到的bug

动态权限

在Android 6.0 中,有些权限属于 Protected Permission,这类权限只在 AndroidManifest.xml中声明是无法真正获取到的,还需要再代码中动态获取,使权限许可弹出对话框,用户点击“允许”后,方可真正获得此权限。
我在向SD卡总存入apk时,出现bug。之前知道Android6.0需要动态添加权限,但是项目没有遇到问题也就没在意。

java.io.FileNotFoundException: /storage/emulated/0/phoneGuardian.apk (Permission deny)

解决方法
动态添加权限

int permission = ActivityCompat.chacekSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission!=PackageManager.PERMISSION_GRANTED){
     //没有权限              ActivityCompat.requestPermissions(RuntimeActivity.this,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STROAGE);
}
FileUriExposedException

下载玩apk进行Intent安装apk,出现bug,catche之后

android.os.FileUriExposedException: file:///storage/emulated/0/xx

因为我也是第一次遇到,所以搜了一下,这里不说具体的解决方法了,看连接
解决FileUriExposedException方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值