package com.lechange.demo.tools; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.util.LruCache; import com.lechange.common.log.Logger; import com.lechange.opensdk.utils.LCOpenSDK_Utils; import com.mm.android.deviceaddmodule.LCDeviceEngine; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class ImageHelper { private final static String TAG = "LCOpenSDK_Demo_ImageHelper"; private static Options mDefaultOption; //最近最少使用算法的缓存策略 private static LruCache mImageCache = new LruCache(100); static { mDefaultOption = new Options(); //demo里面为了降低使用内存,图片缩小了一倍 mDefaultOption.inSampleSize = 2; mDefaultOption.inPreferredConfig = Config.RGB_565; } public static void loadRealImage(final String url, final Handler handler) { downloadImage(url, "real", handler); } /** * 加载普通图片(缓存) * * @param url * @param handler */ public static void loadCacheImage(final String url, final Handler handler) { String[] imageIDBuffer = url.split("[/?]"); final String imageID = imageIDBuffer[imageIDBuffer.length - 2]; Drawable drawable = mImageCache.get(imageID); if (drawable != null) { Message msg = new Message(); msg.what = url.hashCode(); msg.obj = drawable; handler.handleMessage(msg); } else { downloadImage(url, imageID, handler); } } /** * 加载加密图片(缓存) * * @param url * @param key * @param handler */ public static void loadCacheImage(final String url, final String deviceId, String key, int position,final Handler handler) { String[] imageIDBuffer = url.split("[/?]"); String imageID; if (imageIDBuffer.length - 2 > 0) { imageID = imageIDBuffer[imageIDBuffer.length - 2]; } else { imageID = ""; } Drawable drawable = mImageCache.get(imageID); if (drawable != null) { Message msg = new Message(); msg.what = url.hashCode(); msg.obj = drawable; msg.arg1=position; handler.handleMessage(msg); } else { downloadImage(url, imageID, deviceId, key, position, handler); } } /** * 下载普通图片任务 * * @param url * @param imageID * @param handler */ private static void downloadImage(final String url, final String imageID, final Handler handler) { TaskPoolHelper.addTask(new TaskPoolHelper.RunnableTask(imageID) { @Override public void run() { Drawable drawable = null; try { //创建一个url对象 URL resurl = new URL(url); //设置超时时间 HttpURLConnection urlConn = (HttpURLConnection) resurl.openConnection(); urlConn.setConnectTimeout(5000); urlConn.setReadTimeout(5000); //打开URL对应的资源输入流 InputStream is = urlConn.getInputStream(); //从InputStream流中解析出图片 Bitmap bitmap = BitmapFactory.decodeStream(is, null, mDefaultOption); if (bitmap != null) { drawable = new BitmapDrawable(bitmap); } //加入缓存 mImageCache.put(imageID, drawable); //关闭输入流 is.close(); } catch (Exception e) { e.printStackTrace(); } // 解析设备列表信息 handler.obtainMessage(url.hashCode(), drawable).sendToTarget(); // 发送成功消息到界面 } }); } /** * 下载加密图片任务 * * @param url * @param imageID * @param key * @param handler */ private static void downloadImage(final String url, final String imageID, final String deviceId, final String key, final int position, final Handler handler) { TaskPoolHelper.addTask(new TaskPoolHelper.RunnableTask(imageID) { @Override public void run() { Drawable drawable = null; try { //创建一个url对象 URL resurl = new URL(url); //设置超时时间 HttpURLConnection urlConn = (HttpURLConnection) resurl.openConnection(); urlConn.setConnectTimeout(5000); urlConn.setReadTimeout(5000); int code = urlConn.getResponseCode(); Logger.e(TAG, "====getResponseCode, code=" + code + ", resurl.file=" + resurl.getFile()); //打开URL对应的资源输入流 InputStream is = urlConn.getInputStream(); //从InputStream流中解析出图片 ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[500]; int rc = 0; int length = 0; while ((rc = is.read(buff, 0, 500)) > 0) { length += rc; swapStream.write(buff, 0, rc); } byte[] srcBuf = swapStream.toByteArray(); byte[] dstBuf = new byte[500000]; int[] dstLen = new int[1]; dstLen[0] = 500000; Bitmap bitmap; //=null //调用图片解密新接口:三码合一 int res = LCOpenSDK_Utils.decryptPic(LCDeviceEngine.newInstance().accessToken, srcBuf, length, deviceId, key, dstBuf, dstLen); Logger.e(TAG, "====LCOpenSDK_Utils.decryptPic, res=" + res + ", length=" + length); switch (res) { case 0: //解密成功 bitmap = BitmapFactory.decodeByteArray(dstBuf, 0, dstLen[0], mDefaultOption); if (bitmap == null) { String filepath = "sdcard/temp.jpg"; //String sd = Environment.getExternalStorageDirectory() + "/temp.jpg"; File file = new File(filepath); OutputStream outputStream = new FileOutputStream(file); outputStream.write(dstBuf); outputStream.flush(); outputStream.close(); bitmap = BitmapFactory.decodeFile(filepath); Logger.e(TAG, "BitmapFactory.decodeFile"); } if (bitmap != null) { drawable = new BitmapDrawable(bitmap); } break; case 1://待解密数据不完整 case 3: //图片非加密 bitmap = BitmapFactory.decodeByteArray(srcBuf, 0, length, mDefaultOption); if (bitmap != null) { drawable = new BitmapDrawable(bitmap); } break; default: //解密失败 break; } //加入缓存 mImageCache.put(imageID, drawable); //关闭输入流 is.close(); swapStream.close(); } catch (Exception e) { e.printStackTrace(); } // 解析设备列表信息 handler.obtainMessage(url.hashCode(), position,0,drawable).sendToTarget(); // 发送成功消息到界面 } }); } public static void clear() { TaskPoolHelper.clearTask(); mImageCache.evictAll(); } }