import java.io.ByteArrayOutputStream;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;import android.os.AsyncTask;import android.os.Environment;import android.util.Log;import android.widget.ImageView;/** * 处理图片的工具类 */public class ImageUtils {/** * 图片基准路径 */private static final String BASE_SDCARD_IMAGES = "/mnt/sdcard/demo/images/";private static final String TAG = "ImageUtils";/** * 判断文件是否存在 * * @param 文件在本地的完整名 * @return */private static boolean judgeExists(String fullName) {File file = new File(fullName);return file.exists();}/** * 获取最后的‘/’后的文件名 * * @param name * @return */private static String getLastName(String name) {int lastIndexOf = 0;try {lastIndexOf = name.lastIndexOf('/');} catch (Exception e) {e.printStackTrace();}return !name.equals("") ? name.substring(lastIndexOf + 1) : "";}/** * 拼接一个完整的本地文件名 * @param 文件的网络路径 * @return */private static String getImageFullName(String name) {return BASE_SDCARD_IMAGES + getLastName(name);}/** * 通过该网络路径获取Bitmap * @param 该图片的网络路径 */public static Bitmap getBitmap(String urlPath) {Bitmap bitmap = null;String fullName = getImageFullName(urlPath);if (ImageUtils.judgeExists(fullName)) {/* 存在就直接使用 */Log.e(TAG, "使用了sdcard里的图片");bitmap = BitmapFactory.decodeFile(fullName);} else {/* 去下载图片,下载完成之后返回该对象 */Log.e(TAG, "去下载了图片");bitmap = downloadAndSaveBitmap(urlPath, fullName);}return bitmap;}/** * 下载保存图片 * * @param urlPath *            下载路径 * @param fullName *            文件保存路径+文件名 * @return */private static Bitmap downloadAndSaveBitmap(String urlPath, String fullName) {Bitmap bitmap = downloadImage(urlPath);/* 首先判断是否挂载了sdcard */if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {if (bitmap != null) {saveBitmap(fullName, bitmap);}} else {Log.e(TAG, "没有sdcard无法保存图片");}return bitmap;}/** * 保存图片 * * @param fullName * @param bitmap */private static void saveBitmap(String fullName, Bitmap bitmap) {if (bitmap != null) {try {File file = new File(fullName);if (!file.exists()) {creatFolder(fullName);file.createNewFile();}FileOutputStream fos = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();} catch (IOException e) {e.printStackTrace();Log.e(TAG, "图片保存失败,异常信息是:" + e.toString());}} else {Log.e(TAG, "没有下载成功图片,无法保存");}}/** * 创建保存文件的文件夹 * * @param fullName *            带文件名的文件路径 * @return */private static void creatFolder(String fullName) {if (getLastName(fullName).contains(".")) {String newFilePath = fullName.substring(0, fullName.lastIndexOf('/'));File file = new File(newFilePath);file.mkdirs();}}/** * 下载图片 * * @param urlPath * @return */private static Bitmap downloadImage(String urlPath) {try {byte[] byteData = getImageByte(urlPath);if (byteData == null) {Log.e(TAG, "没有得到图片的byte,问题可能是path:" + urlPath);return null;}int len = byteData.length;BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.RGB_565;options.inPurgeable = true;options.inInputShareable = true;options.inJustDecodeBounds = false;if (len > 200000) {// 大于200K的进行压缩处理options.inSampleSize = 2;}return BitmapFactory.decodeByteArray(byteData, 0, len);} catch (Exception e) {e.printStackTrace();Log.e(TAG, "图片下载失败,异常信息是:" + e.toString());return null;}}/** * 获取图片的byte数组 * * @param urlPath * @return */private static byte[] getImageByte(String urlPath) {InputStream in = null;byte[] result = null;try {URL url = new URL(urlPath);HttpURLConnection httpURLconnection = (HttpURLConnection) url.openConnection();httpURLconnection.setDoInput(true);httpURLconnection.connect();if (httpURLconnection.getResponseCode() == 200) {in = httpURLconnection.getInputStream();result = readInputStream(in);in.close();} else {Log.e(TAG, "下载图片失败,状态码是:"+ httpURLconnection.getResponseCode());}} catch (Exception e) {Log.e(TAG, "下载图片失败,原因是:" + e.toString());e.printStackTrace();} finally {Log.e(TAG, "下载图片失败!");if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}return result;}/** * 将输入流转为byte数组 * * @param in * @return * @throws Exception */private static byte[] readInputStream(InputStream in) throws Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = in.read(buffer)) != -1) {baos.write(buffer, 0, len);}baos.close();in.close();return baos.toByteArray();}/** * 此方法用来异步加载图片 * @param imageview * @param path */public static void downloadAsyncTask(final ImageView imageview,final String path) {new AsyncTask<String, Void, Bitmap>() {@Overrideprotected Bitmap doInBackground(String... params) {return getBitmap(path);}@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);if (result != null && imageview != null) {imageview.setImageBitmap(result);} else {Log.e(TAG, "在downloadAsyncTask里异步加载图片失败!");}}}.execute(new String[] {});}}

更多相关文章

  1. Android(安卓)中保存图片的代码
  2. android 保存和读取文件
  3. android之将图片转化为圆形图片
  4. Android(安卓)Cache 解析
  5. android图片裁剪
  6. Android(安卓)O(android 8.1) SYSTEM_UID应用无法使用FileProvider
  7. android中的状态保存
  8. Android拍照、录像、录音代码范例
  9. android 实现保存图片到相册

随机推荐

  1. tp5 ThinkPhp5 自定义异常处理类
  2. ThinkPHP框架快捷键使用说明
  3. 数据库分卷备份 thinkphp3.2版
  4. PHP的SOAP扩展原理和使用(转)
  5. 如果ROW2包含“string”,MySQL会更改ROW1
  6. Ubuntu 9.04:Pecl扩展名下载但不安装
  7. 跟踪PHP中的登录用户
  8. php连接mssql两种方法(com &amp; pdo)
  9. 本机PHP函数将授予我直接访问字符串部分
  10. php多进程处理