不知道是哪里不对,用Mars的代码时有问题:下载中卡死,下载的文件大小不对、下载前取不到文件的大小等问题(没有直接用原代码,只是COPY了Mars的代码。多半是在COPY中出现了问题吧)。后来在网东看看西看看,又去COPY了,就发现,可以了,不过还有一些问题不知道如何解决,复学而易之吧。
说一点是在找MARS老师的毛病,因为我没有没有资格。
以下的代码是在网上找来修改了一下。还有太多需要重构了。(上班时间后学的。)
// private String sOtherURL =
//"http://res.neng.com/res/apk_all/20120603/8761_com.dqvmw.penetratepro_41862300_0.apk";
private String sOtherURL =
"http://img.yingyonghui.com/apk/371226/com.yijia.dazhe.1346917954258.apk";
btOther = (Button)findViewById(R.id.btOther);
btOther.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
HttpDownLoad httpDownloader = new HttpDownLoad();
int result = httpDownloader.downFile(sOtherURL,sSDPath,
sSDName, true);
// (-2:连接超时 -1:下载出错 0:下载成功 1:文件存在)
String sDownLoadInfo = "下载出错 ";
switch (result) {
case -2:
sDownLoadInfo = "连接超时 ";
break;
case -1:
sDownLoadInfo = "下载出错 ";
break;
case 0:
sDownLoadInfo = "下载成功 ";
String filePath = Environment.getExternalStorageDirectory()
+ "/" +sSDPath +"/" +sSDName;
// 只是想验证下载的APK文件,下对了?文件可以覆盖?
openFile(filePath);
// 测试:下对了,文件可以覆盖.
break;
case 1:
sDownLoadInfo = "文件存在 ";
break;
default:
break;
}
Toast.makeText(DownLoadActivity.this, sDownLoadInfo,
Toast.LENGTH_SHORT).show();
}
});
}
// 打开APK程序代码
private void openFile(String filePath) {
File file = new File(filePath);
System.out.println("OpenFile>> " + filePath);
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
startActivity(intent);
}
/**
* 该函数返回整形 (-2:连接超时-1:下载出错 0:下载成功 )
*/
public int downFile(String urlStr, String path, String fileName,
boolean isOverride) {
String sSDpath = Environment.getExternalStorageDirectory()+"/" + path;
File fileDl = CreadeFileDir(sSDpath, fileName);
int iReturn = 0;
try {
InputStream inSt = URLConnection(urlStr);
FileOutputStream fileOS = new FileOutputStream(fileDl);
//测试了一下:2048>每次取流的大小>1024
byte[] buf =newbyte[1024];
int count = 0;
if (inSt ==null)
iReturn = -1;
else {
count = inSt.read(buf);
int iTmp =0;
while (count > 0) {
fileOS.write(buf, 0, count);
count = inSt.read(buf);
iTmp++;
}
iReturn = 0;
System.out.println(" Loop Times>> "+iTmp);
}
fileOS.close();
inSt.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
iReturn = -1;
}
return iReturn;
}
/**
* 创建目录与文件,返回文件
*/
public File CreadeFileDir(String sFilePath, String sFileName) {
File file = null;
final String fileName = sFileName;
File tmpFile = new File(sFilePath);
if (!tmpFile.exists()) {
tmpFile.mkdir();
}
file = new File(sFilePath +"//" + fileName);
return file;
}
public InputStream URLConnection(String sURL) {
InputStream isReturn = null;
try {
URL url = new URL(sURL);
try {
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection();
// 连接超时,时间
urlConn.setConnectTimeout(1000);
//不知道为什么加入下面2句程序要报错???
// 设置方式为POST
// urlConn.setRequestMethod("POST");
// // Post请求不能使用缓存
// urlConn.setUseCaches(false);
// 设置连接允许输入/输出的标志,不能在连接确定后设置
// urlConn.setDoInput(true);
// urlConn.setDoOutput(true);
urlConn.connect();
if (urlConn.getResponseCode() <= 1000) {
System.out.println("内容大小:" + urlConn.getContentLength());
System.out.println("内容类型:" + urlConn.getContentType());
isReturn = urlConn.getInputStream();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return isReturn;
}
上图为读取流中数据不同的Buffer数组的值,后取流中数据的次数。