其实android的文件下载和java是完全相似的,只不过有路径问题和权限问题
1.关于路径问题
通常我们将文件下载到SD卡目录下,那么如何获得SD卡目录呢?
首先我们得有权限去操作这个目录
在AndroidManifest.xml中注册权限:
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
之后再java代码中判断下:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
// 判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限
最后偶获得SD卡目录:
SDPATH = Environment.getExternalStorageDirectory();
在我测试中发现,几乎所有的手机的SD卡目录都是/sdcard/ 但不排除特殊情况,所以还是老老实实的用Environment.getExternalStorageDirectory();吧!
获得SD卡目录后就可以将得到的文件写入了,写入方法和java类似,其实可以说完全相同。
这里我封装了一些我常用的方法(写在这里的目的是为了...):
package tk.orangers.FileUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Environment;
import android.util.Log;
public class FileUtil {
private File SDPATH;//sd卡根目录
public File getSDPATH(){
return this.SDPATH;
}
public FileUtil(){
//得到当前外部存储设备的目录
if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限
SDPATH = Environment.getExternalStorageDirectory();
System.out.println("info:SD dir --> "+SDPATH);
}else {
System.out.println("info:it's no permission to write SD");
}
}
/**
* 在SD卡上创建文件
*
* @param fileName
* @return file
* @throws IOException
*/
public File creatSDFile(String fileName)throws IOException{
File file = new File(SDPATH.getCanonicalPath()+fileName);
file.createNewFile();
return file;
}
/**
* 在SD卡上创建目录
* @param dirName
* @return
*/
public File creatSDDir(String dirName) throws IOException{
File dir = new File(SDPATH.getCanonicalPath()+dirName);
dir.mkdir();
System.out.println("info:file dir --> "+SDPATH+dirName);
return dir;
}
/**
* 判断SD卡上的文件是否存在
* @param fileName
* @return
*/
public boolean isFileExist(String fileName) throws IOException{
File file = new File(SDPATH.getCanonicalPath()+fileName);
return file.exists();
}
/**
* 将衣蛾InputStream里面的数据写入到SD卡中
* @param path
* @param fileName
* @param input
* @return
*/
public File write2SDFromInput(String path,String fileName,InputStream input){
File file = null;
OutputStream output = null;
System.out.println("info:file full path --> "+path+fileName);
try {
creatSDDir(path);
File f = creatSDFile(path+fileName);
output = new FileOutputStream(f);
byte buffer[] = new byte[4*1024];
while((input.read(buffer))!=-1){
output.write(buffer);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(output!=null){
output.flush();
output.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return file;
}
}
2.关于网络问题
同样的还是要判断是否有网络操作权限或者说本机有没有网络可用
ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); //获得网络连接服务
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); //获得网络连接信息
NetworkInfo 的方法完全够你使用了 可以判断当前网络连接,网络连接信息,比如可以使用getType()方法获得网络连接类型,什么CMNET?WIFI?都死可以的
当然在这之前,你必须要获得相应的网络操作权限, 在AndroidManifest.xml中注册权限:
<!-- 访问网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--访问网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
我又封装了些方法,方便我的代码编写,哈哈:
package tk.orangers.HttpDownloadUtil;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import tk.orangers.FileUtil.FileUtil;
public class HttpDownloadUtil {
//-1:没有网络 1:WIFI网络2:wap网络3:net网络
public static final int WIFI = 1;
public static final int CMWAP = 2;
public static final int CMNET = 3;
private Context context;
public HttpDownloadUtil(Context context){
this.context = context;
}
/**
* 获取当前的网络状态 -1:没有网络 1:WIFI网络2:wap网络3:net网络
* @param context
* @return
*/
public int getAPNType() {
int netType = -1;
//获得网络连接服务
ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null) {
return netType;
}
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_MOBILE) {
Log.e("networkInfo.getExtraInfo()","networkInfo.getExtraInfo() is "+ networkInfo.getExtraInfo());
if (networkInfo.getExtraInfo().toLowerCase().equals("cmnet")) {
netType = CMNET;
}
else {
netType = CMWAP;
}
}
else if (nType == ConnectivityManager.TYPE_WIFI) {
netType = WIFI;
}
System.out.println("当前网络类型--》"+netType);
return netType;
}
/**
* 从urlStr字符串中获得网络连接,并将其InputStream返回
* @param urlstr
* @return
* @throws Exception
*/
public InputStream getInputStreamFromUrl(String urlstr) throws Exception{
InputStream inputStream = null;
if(getAPNType()>0){//先判断是否有连接
URL url = new URL(urlstr);
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
inputStream = urlCon.getInputStream();
}
return inputStream;
}
/**
* 从网络上下载一个文本型的文件 ,返回一个String类型的文本
* @param urlstr
* @return
*/
public String downTextFile (String urlstr){
StringBuffer sb = new StringBuffer();
try {
BufferedReader buffer = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(urlstr)));
String line = null;
while((line =buffer.readLine())!=null){
sb.append(line);
}
buffer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
/**
*
* @param urlStr
* @param path
* @param fileName
* @param rewrite 是否复写已存在的文件
* @return 整型:-1:代表下载文件出错,0:下载文件成功,1:代表文件已经存在
*/
public int downFile2SD (String urlStr,String path,String fileName,boolean rewrite){
InputStream inputStream = null;
try {
FileUtil fileUtils = new FileUtil();
if(fileUtils.isFileExist(path+fileName)&&!rewrite){
return 1;
}else {
inputStream = getInputStreamFromUrl(urlStr);
File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
if(resultFile == null){
return -1;
}
}
}catch (Exception e){
e.printStackTrace();
return -1;
}finally {
try {
if(inputStream!=null)
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 0;
}
}