android:将图片写SD卡中(13)

public class MainActivity extends Activity {
	private ImageView showimage;
	private String url = "http://b.hiphotos.baidu.com/image/pic/item/d1160924ab18972bf5f68cc8e0cd7b899f510ae7.jpg";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		showimage = (ImageView) this.findViewById(R.id.showimage);
	}

	public void download(View view) {
		// 1、没有图片,设置默认图片
		showimage.setImageResource(R.drawable.ic_launcher);
		// 2、判断本地是否有图片
		Bitmap bitmap = FileUtils.readImage(url);//调用工具类的读取图片的方法
		if (bitmap != null) {
			showimage.setImageBitmap(bitmap);
		} else {
			new MyAsyncTask().execute(url);
			// 3.没有就联网下载
		}

	}

	class MyAsyncTask extends AsyncTask<String, Void, byte[]> {

		@Override
		protected byte[] doInBackground(String... params) {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(params[0]);
			try {
				HttpResponse response = client.execute(get);
				if (response.getStatusLine().getStatusCode() == 200) {
					byte[] data = EntityUtils.toByteArray(response.getEntity());
					FileUtils.saveImage(params[0], data);//写到SD卡
				}
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}

		@Override
		protected void onPostExecute(byte[] result) {
			// 返回主线程,更新UI
			if (result != null) {
				Bitmap bm = BitmapFactory.decodeByteArray(result, 0,
						result.length);
				showimage.setImageBitmap(bm);
			}
			super.onPostExecute(result);
		}
	}

}
//保存工具类
public class FileUtils {
	/**
	 * 操作SDcard卡的文件工具类
	 */

	// 获取当前的SD卡的根路径// 定义一个缓存目录
	private static final String SDCACHE_DIR = Environment
			.getExternalStorageDirectory() + "/myimages";

	private static final int COMP_JPG = 0;// 图片类型常量
	private static final int COMP_PNG = 1;

	private static final String TAG = "MainActivity";

	/**
	 * 判断SD卡是否挂载
	 * 
	 * @return
	 */
	public static boolean isSDMount() {
		String state = Environment.getExternalStorageState();
		return state.equals(Environment.MEDIA_MOUNTED);

	}

	/**
	 * 保存图片方法一
	 * 
	 * @param url
	 * @param data
	 */
	public static void saveImage(String url, byte[] data) {
		// 1、判断是否有SD卡
		if (!isSDMount()) {
			return;
		}
		// 2.判断是否有缓存的文件夹
		File file = new File(SDCACHE_DIR);
		if (!file.exists()) {
			file.mkdirs();// 可以创建多层目录
		}
		// 3.把图片保存到SD卡
		File filepic = new File(file, getFilename(url));
		OutputStream out;
		try {
			out = new FileOutputStream(filepic);
			out.write(data);
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存图片方法二
	 * 
	 * @param url
	 * @param data
	 */
	public static void saveImage(String url, Bitmap bitmap, int format) {
		// 1、判断是否有SD卡
		if (!isSDMount()) {
			return;
		}
		// 2.判断是否有缓存的文件夹
		File file = new File(SDCACHE_DIR);
		if (!file.exists()) {
			file.mkdirs();// 可以创建多层目录
		}
		// 3.把图片保存到SD卡
		File filepic = new File(file, getFilename(url));
		try {
			OutputStream out = new FileOutputStream(filepic);
			// compress()将一个流转换为位图,并保存到SD卡
			bitmap.compress((format == COMP_JPG ? CompressFormat.JPEG
					: CompressFormat.PNG), 100, out);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 获取图片文件的名字
	 * 
	 * @param url
	 * @return
	 */
	public static String getFilename(String url) {

		return url.substring(url.lastIndexOf("/") + 1);// http://xxxx/filename.jpg
	}

	public static Bitmap readImage(String url) {
		// 先判断SD是否挂载
		if (!isSDMount()) {
			return null;
		}
		File file = new File(SDCACHE_DIR, getFilename(url));
		if (file.exists()) {
			return BitmapFactory.decodeFile(file.getAbsolutePath());
		}

		return null;
	}

}


你可能感兴趣的:(android:将图片写SD卡中(13))