先贴出下载apk的代码
<span style="font-family:SimSun;font-size:18px;">private class downloadApkThread extends Thread {
@Override
public void run() {
InputStream inStream = null;
FileOutputStream fos = null;
try {
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 获得存储卡路径
String sdPath = Environment.getExternalStorageDirectory() + "/";
savePath = sdPath + "download";
URL url = new URL(ConstantString.URL_DOWNLOAD_APK + hashMap.get("name"));
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
inStream = conn.getInputStream();
File dir = new File(savePath);
// 判断目录是否存在
if (!dir.exists()) {
dir.mkdir();
}
File apkFile = new File(savePath, hashMap.get("name"));
fos = new FileOutputStream(apkFile);
int count = 0;
// 缓存
byte[] buffer = new byte[1024];
do {
int numread = inStream.read(buffer);
count += numread;
// 计算进度
progress = (int) (((float) (count / length)) * 100);
// 更新进度
mHandler.sendEmptyMessage(DOWNLOAD);
if (numread <= 0) {
// 下载完成
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
// 写入文件
fos.write(buffer, 0, numread);
} while (!cancelUpdate);// 用户点击“取消”就停止下载
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fos != null)
fos.close();
if (inStream != null)
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 取消显示 下载对话框
if (downloadDialog != null) {
downloadDialog.dismiss();
}
}
}</span>
URL请求的具体实现,网上各种各样,没有什么好纠结的了。URL路径完全没有问题,替换成同目录下的其他类型文件,可以找到文件,唯独找不到文件。
找了几个小时,悄然发现,原来和IIS的设置有关系,我这边使用的测试服务器为IIS,IIS默认限制了apk类型文件的下载,所以输入流拿不到文件数据,提示“找不到文件”。
最终解决办法:
1、在管理工具里打开Internet 信息服务(IIS)管理器。然后选择需要配置的网站。
2、右侧的界面中会显示该网站的所有功能配置,我们选择并点击进入“MIME类型”。
3、在右侧的操作区选择点击“添加”MIME。
4、在弹出的添加窗口里的文件扩展名输入:APK
在MIME类型输入:application/vnd.android.package-archive
按确定。