您的位置:首页 > 移动开发

APP版本升级与服务器交互

2017-05-25 11:32 267 查看
踏入程序媛旅程已经快一年了,学生生涯也即将结束,正式踏入工作岗位。万事开头难,只能多问多记,久病成医,遇到的问题多了自己的技术也会有所提高。博客也一年了,之前一直想写博,然后各种拖延,到现在才开始,希望自己能坚持。

项目中加了一个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方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐