APP版本升级与服务器交互
2017-05-25 11:32
267 查看
踏入程序媛旅程已经快一年了,学生生涯也即将结束,正式踏入工作岗位。万事开头难,只能多问多记,久病成医,遇到的问题多了自己的技术也会有所提高。博客也一年了,之前一直想写博,然后各种拖延,到现在才开始,希望自己能坚持。
项目中加了一个APP版本升级功能。之前写的版本升级是由第三方蒲公英版本更新来做。这次由于后台并没有给相应接口(比较坑),然后让我这只菜鸟自己去写服务端接口(真是恐慌呀!),经过各种debug,总算over。
IIS
IIS配置
写json文件
代码块
Android端
访问网络解析json
遇到的bug
动态权限
FileUriExposedException
打开IIS管理器(快捷方式:inetmgr),找到项目的网站
双击之后会在右边看到该网站的所有功能配置,我们选择并点击进入“MIME类型”,在右侧选择“添加”
之后在弹出的添加窗口里的文件扩展名输入:.apk
在MIME类型输入:application/vnd.android.package-archive
按确定。
点击确定之后会在MIME类型中看到.apk;IIS支持.json文件也是同样的步骤
这样需要的IIS就配置完成了,在浏览器中就可以访问到自己写的json文件和apk了。
然后在update.json文本中写json(按照json格式,看bejson能校验通过吗)
内容可以自己随意添加。其中downloadURL的value值是存放的.apk的路径,当然localhost要用IP地址代替“http://x.x.x.:端口号/路径”
我在向SD卡总存入apk时,出现bug。之前知道Android6.0需要动态添加权限,但是项目没有遇到问题也就没在意。
解决方法
动态添加权限
因为我也是第一次遇到,所以搜了一下,这里不说具体的解决方法了,看连接
解决FileUriExposedException方法
项目中加了一个APP版本升级功能。之前写的版本升级是由第三方蒲公英版本更新来做。这次由于后台并没有给相应接口(比较坑),然后让我这只菜鸟自己去写服务端接口(真是恐慌呀!),经过各种debug,总算over。
目录
目录IIS
IIS配置
写json文件
代码块
Android端
访问网络解析json
遇到的bug
动态权限
FileUriExposedException
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方法
相关文章推荐
- iOS如何取得APP的版本信息跟服务器对比进行升级提示?
- iOS如何取得APP的版本信息跟Apple服务器对比进行升级提示?
- iOS如何取得APP的版本信息跟服务器对比进行升级提示
- (转)iOS如何取得APP的版本信息跟服务器对比进行升级提示?
- iOS如何取得APP的版本信息跟服务器对比进行升级提示?
- APP开发实战135-APP版本更新之APP和服务器交互
- OS如何取得APP的版本信息跟服务器对比进行升级提示?
- 开源 Android App 增量更新库 版本升级
- CentOS服务器单独升级 php5.1 到 5.2版本
- 卡巴6.0.1.411版本升级服务器(解决地震造成的不能升级问题(12310125更新,307可以升啦))
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- 软件升级公告:最新版本V1.2.05.115 更新日期2011-9-18 有需要升级的朋友可以到服务器上下载
- Pull解析xml,在线升级中的获取服务器版本与本地版本比较
- 部署一台Windows 2003 32位服务器,安装oracle 9.2.0.1版本的数据库,并且升级到9.2.0.6
- 已备份数据库的磁盘结构版本为611,服务器支持版本为539,无法还原或升级数据库
- App版本升级接口设计注意事项
- App自动更新之通知栏下载 版本更新 与 升级
- android app 版本升级
- 已备份数据库的磁盘结构版本为611,服务器支持版本为539,无法还原或升级数据库 推荐
- 如何将SAV服务器从SAV10.1.0.394升级到SAV10.1.5.5000版本