在这两个星期的项目开发中,东京的一个项目需要获取用户的头像并显示。先下载到本地,然后读取。每次登陆都要更新一次头像。为此,我封装了一个类,用于诸如此类的操作:ImageHelper.java
package net.emgz.android.provider.impl;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
/**
* 在项目中经常会遇到保存网络上的图片或者其他文件到本地中,
* 如SD卡。这个类能够很方便的实现网络上文件的下载和保存.这里是下载和保存网络上的图片
* @author Kaven
* @version 2012-07-16
*/
public class ImageHelper {
public ImageHelper() {
}
/**
* @param url 要下载的文件地址
* @return Bitmap对象
*/
public static Bitmap DownloadImageFromNet(String url) {
Bitmap bt = null;
try {
/*
* *************** 取得的是byte数组, 从byte数组生成bitmap***********************
* byte[] data =
* getImage(filePath); if(data!=null){ bitmap =
* BitmapFactory.decodeByteArray(data, 0, data.length);// bitmap
* imageView.setImageBitmap(bitmap);// display image }else{
* Toast.makeText(AndroidTest2_3_3.this, "Image error!", 1).show();
* }
*/
// ******** 取得的是InputStream,直接从InputStream生成bitmap ***********/
bt = BitmapFactory.decodeStream(getImageStream(url));
if (bt != null) {
return bt;
}
} catch (Exception e) {
// Toast.makeText(context, "Newwork error!",
// Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
return null;
}
/**
* 构建输入流
*
* @param path
* The path of image
* @return InputStream
* @throws Exception
*/
public static InputStream getImageStream(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
return conn.getInputStream();
}
return null;
}
/**
* 把下载的图片保存到本地,如果已经存在同名的文件,则覆盖。保存的类型是JPEG
*
* @param bm Bitmap实例
* @param fileName
* 指定图片的名字
* @param savePath
* 要把图片保存到的路径
* @throws IOException
*/
public static void saveFile(Bitmap bm, String fileName, String savePath)
throws IOException {
if (bm != null) {
String SAVE_PATH = savePath;
File dirFile = new File(SAVE_PATH);
if (!dirFile.exists()) {
dirFile.mkdir();
}
File myCaptureFile = new File(SAVE_PATH + fileName);
if (myCaptureFile != null) { //如果已经存在同名的文件,则覆盖
myCaptureFile.delete();
}
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
}
}
/**
* @param localPath 本地中文件的路径 如:"mmt/sdcard/userdata/image"
* @return Bitmap
*/
public static Bitmap getLocalImage(String localPath){
Bitmap bm = BitmapFactory.decodeFile(localPath);
return bm;
}
}
应用的一个实例:因为考虑到下载的操作可能会耗时比较长,所以需要把下载的动作放到线程里面。
/**
* Load the user's image
* @author Su
* @version 2012.07.14
*/
public void downLoadUserImage() {
final String uri = HttpService.BASE_HOST + HttpService.USER_AVATAR_URI;
final URI expanded = new UriTemplate(uri).expand(userinfo.getUserCd(),
HttpService.IMAGE_SIZE);
final String download_uri = expanded.toString();
new Thread() {
@Override
public void run() {
bitmap = ImageHelper
.DownloadImageFromNet(download_uri);
Message msg = new Message();
try {
if (bitmap != null) {
ImageHelper.saveFile(bitmap, HttpService.SAVE_NAME,
HttpService.SAVE_PATH);
msg.what = 0;
handler.sendMessage(msg);
} else {
Bitmap bm = BitmapFactory
.decodeFile(HttpService.LOAD_PATH);
if (bm != null) {
msg.what = 0;
handler.sendMessage(msg);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
下载后存到本地,然后从本地中显示刚刚下载的图片:
final ImageView image = (ImageView) findViewById(R.id.userinfo_avater);
Bitmap bm = BitmapFactory.decodeFile(HttpService.LOAD_PATH);
image.setImageBitmap(bm);