首页 > 代码库 > 安卓图片下载及存储
安卓图片下载及存储
网上找到一个下载图片的工具类,下载到的图片是Drawable类型的。
1 package com.cn.gordon.exhibition.walk.utils; 2 3 import java.io.InputStream; 4 import java.lang.ref.SoftReference; 5 import java.net.URL; 6 import java.net.URLConnection; 7 import java.util.HashMap; 8 import java.util.concurrent.BlockingQueue; 9 import java.util.concurrent.LinkedBlockingQueue; 10 import java.util.concurrent.RejectedExecutionHandler; 11 import java.util.concurrent.ThreadPoolExecutor; 12 import java.util.concurrent.TimeUnit; 13 14 import android.graphics.drawable.Drawable; 15 import android.os.Handler; 16 import android.os.Looper; 17 /** 18 * 加载图片类 19 * @author jialg 20 * 21 */ 22 public class AsyncImageLoader { 23 private static final String TAG = "AsyncImageLoader"; 24 private ThreadPoolExecutor mPoolExecutor; 25 private HashMap<String, SoftReference<Drawable>> imageCache; 26 private Handler mMainThreadHandler; 27 28 /** 29 * 创建一个异步图片加载器,默认最大5个工作线程,最大等待队列20 30 */ 31 public AsyncImageLoader() { 32 this(5, 20); 33 } 34 35 /** 36 * 创建一个异步图片加载器,当等待下载的图片超过设置的最大等待数量之后,会从等待队列中放弃一个最早加入队列的任务 37 * 38 * @param maxPoolSize 最大工作线程数 39 * @param queueSize 最大等待数 40 */ 41 public AsyncImageLoader(int maxPoolSize, int queueSize) { 42 this(2, maxPoolSize, 3, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(queueSize), 43 new ThreadPoolExecutor.DiscardOldestPolicy()); 44 } 45 46 /** 47 * 自定义线程池的加载器,请参考:{@link ThreadPoolExecutor} 48 * 49 * @param corePoolSize 50 * @param maximumPoolSize 51 * @param keepAliveTime 52 * @param unit 53 * @param workQueue 54 * @param handler 55 */ 56 public AsyncImageLoader(int corePoolSize, int maximumPoolSize, long keepAliveTime, 57 TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { 58 imageCache = new HashMap<String, SoftReference<Drawable>>(); 59 mPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, 60 workQueue, handler); 61 mMainThreadHandler = new Handler(Looper.getMainLooper()); 62 } 63 64 /** 65 * 异步加载一张图片 66 * 67 * @param imageUrl 68 * @param imageCallback 69 */ 70 public void loadDrawable(final String imageUrl, final ImageCallback imageCallback) { 71 if (imageCache.containsKey(imageUrl)) { 72 SoftReference<Drawable> softReference = imageCache.get(imageUrl); 73 Drawable drawable = softReference.get(); 74 if (drawable != null) { 75 imageCallback.onLoaded(drawable); 76 return; 77 } 78 } 79 LoadImageTask task = new LoadImageTask(imageUrl, this, mMainThreadHandler, imageCallback); 80 mPoolExecutor.execute(task); 81 } 82 83 /** 84 * 停止线程池运行,停止之后,将不能在继续调用 {@link #loadDrawable(String, ImageCallback)} 85 */ 86 public void shutdown() { 87 mPoolExecutor.shutdown(); 88 imageCache.clear(); 89 } 90 91 private void cache(String url, Drawable drawable) { 92 imageCache.put(url, new SoftReference<Drawable>(drawable)); 93 } 94 95 /** 96 * 下载任务 97 * 98 */ 99 private static final class LoadImageTask implements Runnable {100 101 private Handler mHandler;102 private ImageCallback mCallback;103 private AsyncImageLoader mLoader;104 private String mPath;105 106 /**107 * @param imgPath 要下载的图片地址108 * @param loader 图片加载器109 * @param handler 主线程Handler110 * @param imageCallback 图片加载回调111 */112 public LoadImageTask(String imgPath, AsyncImageLoader loader, Handler handler,113 ImageCallback imageCallback) {114 this.mHandler = handler;115 this.mPath = imgPath;116 this.mLoader = loader;117 this.mCallback = imageCallback;118 }119 120 @Override121 public void run() {122 URL url;123 InputStream is = null;124 try {125 url = new URL(mPath);126 URLConnection conn = url.openConnection();127 conn.connect();128 is = conn.getInputStream();129 final Drawable drawable = Drawable.createFromStream(is, "src");130 mLoader.cache(mPath, drawable);131 mHandler.post(new Runnable() {132 133 @Override134 public void run() {135 mCallback.onLoaded(drawable);136 }137 });138 } catch (final Exception e) {139 mHandler.post(new Runnable() {140 141 @Override142 public void run() {143 mCallback.onError(e);144 }145 });146 }147 }148 }149 150 /**151 * 回调接口,在主线程中运行152 * 153 */154 public static interface ImageCallback {155 /**156 * 加载成功157 * 158 * @param imageDrawable 下载下来的图片159 */160 public void onl oaded(Drawable drawable);161 162 /**163 * 加载失败164 * 165 * @param e 异常166 */167 public void one rror(Exception e);168 }169 }
图片下载之后,要进行存储,存储的类型是Bitmap,所以要将图片先转成BitmapDrawable,然后再转成Bitmap,运用上面的工具类进行图片的下载,并进行保存。
public class EntryActivity extends Activity { private AsyncImageLoader asyncImageLoader; private static String ALBUM_PATH = getSDPath() + java.io.File.separator + "exhibition_walk"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.walkmain); asyncImageLoader= new AsyncImageLoader(); init(); } private void init(){ asyncImageLoader.loadDrawable(urlStr, new ImageCallback(){ @Override public void onl oaded(Drawable imageDrawable) { if(imageDrawable != null){ v1.setImageDrawable(imageDrawable); BitmapDrawable draw = (BitmapDrawable) imageDrawable; final Bitmap bitmap = draw.getBitmap(); try { if (bitmap!=null) { Toast.makeText(EntryActivity.this, "下载的图片可用", Toast.LENGTH_SHORT).show(); savePicture(bitmap, System.currentTimeMillis()+".jpg"); }else{ Toast.makeText(EntryActivity.this, "下载的图片不可用", Toast.LENGTH_SHORT).show(); } } catch (IOException e) { e.printStackTrace(); } } } @Override public void one rror(Exception e) { } }); } private void savePicture(Bitmap bitmap,String fileName) throws IOException{ File dirFile = new File(ALBUM_PATH); if(!dirFile.exists()){ dirFile.mkdirs(); Toast.makeText(EntryActivity.this, "创建文件夹", Toast.LENGTH_SHORT).show(); } File myCaptureFile = new File(ALBUM_PATH + java.io.File.separator +fileName); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close(); }/** * 获取sd卡的路径 * * @return 路径的字符串 */ public static String getSDPath() { File sdDir = null; boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在 if (sdCardExist) { sdDir = Environment.getExternalStorageDirectory();// 获取外存目录 } return sdDir.toString(); }}
最后,图片存储到sd卡上,要进行权限的声明:
1 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />2 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
安卓图片下载及存储
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。