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) {
		// 一、沒有圖片,設置默認圖片
		showimage.setImageResource(R.drawable.ic_launcher);
		// 二、判斷本地是否有圖片
		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) {
		// 一、判斷是否有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) {
		// 一、判斷是否有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;
	}

}
相關文章
相關標籤/搜索