package com.bigdo.app; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import org.json.JSONException; import org.json.JSONObject; import com.bigdo.common.RConfig; import com.bigdo.common.RState; import com.bigdo.util.Base64; import com.bigdo.util.MD5; import com.bigdo.util.WSCheck; import com.bigdo.util.WSHelper; import com.bigdo.util.WSResult; import android.annotation.SuppressLint; import android.content.ContentResolver; import android.graphics.Bitmap; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.provider.MediaStore.Images.Media; import android.util.Log; import android.widget.ImageView; import android.widget.ImageView.ScaleType; public abstract class AsyncImgDown { private boolean isExist = true, isRun = false; private HashMap<String, AsyncImgDownInfo> imgRequest; private String curr_request = ""; protected BaseActivity a; protected ContentResolver cr; private String _sdDir = ""; public AsyncImgDown(BaseActivity a) { String status = Environment.getExternalStorageState(); if (!status.equals(Environment.MEDIA_MOUNTED)) { isExist = false; } else { _sdDir = Environment.getExternalStorageDirectory() + ""; } imgRequest = new HashMap<String, AsyncImgDownInfo>(); this.a = a; cr = a.getContentResolver(); } protected String sdDir(int requestCode) { if (_sdDir != null && !_sdDir.equals("")) { return _sdDir + imgDir(requestCode); } return ""; } protected boolean loadImg(ImageView img, String path, String error, int requestCode) { if (isExist) { if (path != null && !path.equals("")) { File f = new File(path); if (f.exists()) { try { img.setImageBitmap(null); img.setDrawingCacheEnabled(false); img.setDrawingCacheEnabled(true); Uri u = Uri.fromFile(f); Bitmap bmp = MediaStore.Images.Media.getBitmap(cr, u); // Bitmap bmp = Media.getBitmap(cr, u); img.setImageBitmap(bmp);// if ("l".equals(img.getTag())) { img.setScaleType(ScaleType.CENTER_CROP); } else { if ("CENTER".equals(img.getTag())) { img.setScaleType(ScaleType.CENTER); } else { img.setScaleType(ScaleType.CENTER_CROP); } } return true; } catch (Exception e) { } } } if ("no_exist_for_service".equals(error)) { img.setScaleType(ScaleType.CENTER); // img.setImageResource(R.drawable.video_img_failure); int imgf = imgFailure(requestCode); if (imgf > 0) { img.setImageResource(imgf); } else { img.setImageBitmap(null); } return true; } else { img.setScaleType(ScaleType.CENTER); // img.setImageResource(R.drawable.video_img_loading); int imgl = imgLoading(requestCode); if (imgl > 0) { img.setImageResource(imgl); } else { img.setImageBitmap(null); } } return false; } else { img.setScaleType(ScaleType.CENTER); // img.setImageResource(R.drawable.video_img_failure); int imgf = imgFailure(requestCode); if (imgf > 0) { img.setImageResource(imgf); } else { img.setImageBitmap(null); } return true; } } public String startGetImg(AsyncImgDownInfo data) { try { if (isExist) { if (data != null && data.downName != null && !data.downName.equals("") && data.cacheName != null && !data.cacheName.equals("")) { // String img_name = handleImgName(data.cacheName); if (!imgRequest.containsKey(data.cacheName)) { imgRequest.put(data.cacheName, data); if (doStartGetImg()) { return "geting_for_service"; } } else { return "geting_for_service"; } } } } catch (Exception e) { } return "no_exist_for_service"; } private boolean doStartGetImg() { if (!isRun && isExist) { if (imgRequest != null && imgRequest.size() > 0) { isRun = true; AsyncImgDownInfo val = null; JSONObject jparams = null; boolean error = false, isBreak = true; while (imgRequest != null && imgRequest.size() > 0) { Iterator<Entry<String, AsyncImgDownInfo>> iter = imgRequest .entrySet().iterator(); error = false; isBreak = true; while (iter.hasNext()) { Entry<String, AsyncImgDownInfo> entry = iter.next(); val = entry.getValue(); curr_request = entry.getKey(); try { jparams = new JSONObject(); jparams.put("pos", val.pos); jparams.put("img", val.downName); jparams.put("param", val.param); } catch (JSONException e) { jparams = null; error = true; } if (error || val == null || curr_request == null || curr_request.equals("")) { imgRequest.remove(curr_request); isBreak = false; break; } isBreak = true; break; } if (isBreak) { break; } } if (jparams != null) { String u = RConfig.getImg(this.a); String data = jparams.toString(); new WSHelper(this.a, "", false, img_handler, u, null, WSHelper.getStringEntity(data), 0, val.pos, 0, 0, WSHelper.POST).start(); Log.e("doStartGetImg", u); Log.e("doStartGetImg_data", data); u = null; data = null; jparams = null; return true; } } return false; } else { return true; } } public void updateVideoImg(WSResult result, int pos) { String path = ""; AsyncImgDownInfo info = null; if (isExist) { StringBuilder outMsg = new StringBuilder(); JSONObject jresult = WSCheck.Json(this.a, result, outMsg); try { info = imgRequest.get(curr_request); if (jresult != null) { String data = ""; data = jresult.getString("data"); if (data != null && !data.equals("")) { byte[] imgData = Base64.decode(data, Base64.DEFAULT); if (imgData != null && imgData.length > 0) { try { File tdf = new File(sdDir(info.requestCode)); if (!tdf.exists()) { tdf.mkdirs(); } String fn = curr_request + ".r"; File f = new File(tdf, fn); if (f.exists()) { f.delete(); } FileOutputStream fosto = new FileOutputStream(f); fosto.write(imgData, 0, imgData.length); // 将内容写到新文件当中 fosto.flush(); fosto.close(); imgData = null; path = sdDir(info.requestCode) + fn; } catch (Exception e) { } } } } } catch (Exception e) { } } finishGetImg(path, info); try { if (imgRequest.size() > 0) { imgRequest.remove(curr_request); } } catch (Exception e) { } curr_request = ""; isRun = false; doStartGetImg(); } protected String handleImgName(String img_name) { if (img_name != null && !img_name.equals("")) { img_name = MD5.encode(img_name); } return img_name; } @SuppressLint("HandlerLeak") protected Handler img_handler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.arg1 == RState.WSCall) { WSResult result = (WSResult) msg.getData().getParcelable( WSResult.ResultKey); updateVideoImg(result, result.RequestCode2); } } }; protected abstract void finishGetImg(String path, final AsyncImgDownInfo info); protected abstract String imgDir(int requestCode); protected abstract int imgFailure(int requestCode); protected abstract int imgLoading(int requestCode); }