踏入程序媛旅程已经快一年了,学生生涯也即将结束,正式踏入工作岗位。万事开头难,只能多问多记,久病成医,遇到的问题多了自己的技术也会有所提高。博客也一年了,之前一直想写博,然后各种拖延,到现在才开始,希望自己能坚持。
项目中加了一个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方法