package com.zenip.weibo.sdk.android.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; import android.app.AlertDialog.Builder; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import com.weibo.sdk.android.WeiboParameters; import com.zenip.weibo.sdk.android.Weibo; public class Utility { private static char[] sEncodes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" .toCharArray(); private static byte[] sDecodes = new byte[256]; public static Bundle parseUrl(String url) { try { URL u = new URL(url); Bundle b = decodeUrl(u.getQuery()); b.putAll(decodeUrl(u.getRef())); return b; } catch (MalformedURLException e) { return new Bundle(); } } public static Bundle decodeUrl(String s) { Bundle params = new Bundle(); if (s != null) { String[] array = s.split("&"); for (String parameter : array) { String[] v = parameter.split("="); params.putString(URLDecoder.decode(v[0]), URLDecoder.decode(v[1])); } } return params; } public static String encodeUrl(WeiboParameters parameters) { if (parameters == null) { return ""; } StringBuilder sb = new StringBuilder(); boolean first = true; for (int loc = 0; loc < parameters.size(); loc++) { if (first) { first = false; } else { sb.append("&"); } String _key = parameters.getKey(loc); String _value = parameters.getValue(_key); if (_value == null) { Log.i("encodeUrl", "key:" + _key + " 's value is null"); } else { sb.append(URLEncoder.encode(parameters.getKey(loc)) + "=" + URLEncoder.encode(parameters.getValue(loc))); } } return sb.toString(); } public static String encodeParameters(WeiboParameters httpParams) { if (null == httpParams || isBundleEmpty(httpParams)) { return ""; } StringBuilder buf = new StringBuilder(); int j = 0; for (int loc = 0; loc < httpParams.size(); loc++) { String key = httpParams.getKey(loc); if (j != 0) { buf.append("&"); } try { buf.append(URLEncoder.encode(key, "UTF-8")) .append("=") .append(URLEncoder.encode(httpParams.getValue(key), "UTF-8")); } catch (java.io.UnsupportedEncodingException neverHappen) { } j++; } return buf.toString(); } public static void showAlert(Context context, String title, String text) { Builder alertBuilder = new Builder(context); alertBuilder.setTitle(title); alertBuilder.setMessage(text); alertBuilder.create().show(); } private static boolean isBundleEmpty(WeiboParameters bundle) { if (bundle == null || bundle.size() == 0) { return true; } return false; } /** * 将data编码成Base62的字符串 * * @param data * @return */ public static String encodeBase62(byte[] data) { StringBuffer sb = new StringBuffer(data.length * 2); int pos = 0, val = 0; for (int i = 0; i < data.length; i++) { val = (val << 8) | (data[i] & 0xFF); pos += 8; while (pos > 5) { pos -= 6; char c = sEncodes[val >> pos]; sb.append(c == 'i' ? "ia" : c == '+' ? "ib" : c == '/' ? "ic" : c); val &= 1 << pos - 1; } } if (pos > 0) { char c = sEncodes[val << (6 - pos)]; sb.append(c == 'i' ? "ia" : c == '+' ? "ib" : c == '/' ? "ic" : c); } return sb.toString(); } /** * 将字符串解码成byte数组 * * @param data * @return */ public static byte[] decodeBase62(String string) { if (string == null) { return null; } char[] data = string.toCharArray(); ByteArrayOutputStream baos = new ByteArrayOutputStream( string.toCharArray().length); int pos = 0, val = 0; for (int i = 0; i < data.length; i++) { char c = data[i]; if (c == 'i') { c = data[++i]; c = c == 'a' ? 'i' : c == 'b' ? '+' : c == 'c' ? '/' : data[--i]; } val = (val << 6) | sDecodes[c]; pos += 6; while (pos > 7) { baos.write(val >> (pos -= 8)); val &= ((1 << pos) - 1); } } return baos.toByteArray(); } private static boolean deleteDependon(File file, int maxRetryCount) { int retryCount = 1; maxRetryCount = (maxRetryCount < 1) ? 5 : maxRetryCount; boolean isDeleted = false; if (file != null) { while ((!(isDeleted)) && (retryCount <= maxRetryCount) && (file.isFile()) && (file.exists())) { if (!((isDeleted = file.delete()))) { // LogUtils.i(file.getAbsolutePath() + "删除失败,失败次数为:" + // retryCount); ++retryCount; } } } return isDeleted; } private static void mkdirs(File dir_) { if (dir_ == null) { return; } if ((!(dir_.exists())) && (!(dir_.mkdirs()))) { throw new RuntimeException("fail to make " + dir_.getAbsolutePath()); } } private static void createNewFile(File file_) { if (file_ == null) { return; } if (!(__createNewFile(file_))) { throw new RuntimeException(file_.getAbsolutePath() + " doesn't be created!"); } } private static void delete(File f) { if ((f != null) && (f.exists()) && (!(f.delete()))) { throw new RuntimeException(f.getAbsolutePath() + " doesn't be deleted!"); } } private static boolean __createNewFile(File file_) { if (file_ == null) { return false; } makesureParentExist(file_); if (file_.exists()) { delete(file_); } try { return file_.createNewFile(); } catch (IOException e) { e.printStackTrace(); } return false; } private static boolean deleteDependon(String filepath, int maxRetryCount) { if (TextUtils.isEmpty(filepath)) { return false; } return deleteDependon(new File(filepath), maxRetryCount); } private static boolean deleteDependon(String filepath) { return deleteDependon(filepath, 0); } private static boolean doesExisted(File file) { return ((file != null) && (file.exists())); } private static boolean doesExisted(String filepath) { if (TextUtils.isEmpty(filepath)) { return false; } return doesExisted(new File(filepath)); } private static void makesureParentExist(File file_) { if (file_ == null) { return; } File parent = file_.getParentFile(); if ((parent != null) && (!(parent.exists()))) { mkdirs(parent); } } // private static void makesureParentExist(String filepath) // { // if(filepath==null){ // return; // } // makesureParentExist(new File(filepath)); // } private static void makesureFileExist(File file) { if (file == null) { return; } if (!(file.exists())) { makesureParentExist(file); createNewFile(file); } } private static void makesureFileExist(String filePath_) { if (filePath_ == null) { return; } makesureFileExist(new File(filePath_)); } // 判断当前网络是否为wifi public static boolean isWifi(Context mContext) { ConnectivityManager connectivityManager = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { return true; } return false; } /** * 上传图片的策略 * * @author SinaDev */ public static final class UploadImageUtils { private static void revitionImageSizeHD(String picfile, int size, int quality) throws IOException { if (size <= 0) { throw new IllegalArgumentException( "size must be greater than 0!"); } if (!doesExisted(picfile)) { throw new FileNotFoundException(picfile == null ? "null" : picfile); } if (!BitmapHelper.verifyBitmap(picfile)) { throw new IOException(""); } int photoSizesOrg = 2 * size; FileInputStream input = new FileInputStream(picfile); final BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeStream(input, null, opts); try { input.close(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } int rate = 0; for (int i = 0;; i++) { if ((opts.outWidth >> i <= photoSizesOrg && (opts.outHeight >> i <= photoSizesOrg))) { rate = i; break; } } opts.inSampleSize = (int) Math.pow(2, rate); opts.inJustDecodeBounds = false; Bitmap temp = safeDecodeBimtapFile(picfile, opts); if (temp == null) { throw new IOException("Bitmap decode error!"); } deleteDependon(picfile); makesureFileExist(picfile); int org = temp.getWidth() > temp.getHeight() ? temp.getWidth() : temp.getHeight(); float rateOutPut = size / (float) org; if (rateOutPut < 1) { Bitmap outputBitmap; while (true) { try { outputBitmap = Bitmap.createBitmap( ((int) (temp.getWidth() * rateOutPut)), ((int) (temp.getHeight() * rateOutPut)), Bitmap.Config.ARGB_8888); break; } catch (OutOfMemoryError e) { System.gc(); rateOutPut = (float) (rateOutPut * 0.8); } } if (outputBitmap == null) { temp.recycle(); } Canvas canvas = new Canvas(outputBitmap); Matrix matrix = new Matrix(); matrix.setScale(rateOutPut, rateOutPut); canvas.drawBitmap(temp, matrix, new Paint()); temp.recycle(); temp = outputBitmap; } final FileOutputStream output = new FileOutputStream(picfile); if (opts != null && opts.outMimeType != null && opts.outMimeType.contains("png")) { temp.compress(Bitmap.CompressFormat.PNG, quality, output); } else { temp.compress(Bitmap.CompressFormat.JPEG, quality, output); } try { output.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } temp.recycle(); } private static void revitionImageSize(String picfile, int size, int quality) throws IOException { if (size <= 0) { throw new IllegalArgumentException( "size must be greater than 0!"); } if (!doesExisted(picfile)) { throw new FileNotFoundException(picfile == null ? "null" : picfile); } if (!BitmapHelper.verifyBitmap(picfile)) { throw new IOException(""); } FileInputStream input = new FileInputStream(picfile); final BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeStream(input, null, opts); try { input.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } int rate = 0; for (int i = 0;; i++) { if ((opts.outWidth >> i <= size) && (opts.outHeight >> i <= size)) { rate = i; break; } } opts.inSampleSize = (int) Math.pow(2, rate); opts.inJustDecodeBounds = false; Bitmap temp = safeDecodeBimtapFile(picfile, opts); if (temp == null) { throw new IOException("Bitmap decode error!"); } deleteDependon(picfile); makesureFileExist(picfile); final FileOutputStream output = new FileOutputStream(picfile); if (opts != null && opts.outMimeType != null && opts.outMimeType.contains("png")) { temp.compress(Bitmap.CompressFormat.PNG, quality, output); } else { temp.compress(Bitmap.CompressFormat.JPEG, quality, output); } try { output.close(); } catch (Exception e) { e.printStackTrace(); } temp.recycle(); } public static boolean revitionPostImageSize(String picfile) { try { if (Weibo.isWifi) { revitionImageSizeHD(picfile, 1600, 75); } else { revitionImageSize(picfile, 1024, 75); } return true; } catch (IOException e) { e.printStackTrace(); } return false; } private static final int MAX_TRIAL = 5; /** * 如果加载时遇到OutOfMemoryError,则将图片加载尺寸缩小一半并重新加载 * * @param bmpFile * @param opts * 注意:opts.inSampleSize 可能会被改变 * @return */ private static Bitmap safeDecodeBimtapFile(String bmpFile, BitmapFactory.Options opts) { BitmapFactory.Options optsTmp = opts; if (optsTmp == null) { optsTmp = new BitmapFactory.Options(); optsTmp.inSampleSize = 1; } Bitmap bmp = null; FileInputStream input = null; for (int i = 0; i < MAX_TRIAL; ++i) { try { input = new FileInputStream(bmpFile); bmp = BitmapFactory.decodeStream(input, null, opts); try { input.close(); } catch (IOException e) { e.printStackTrace(); } break; } catch (OutOfMemoryError e) { e.printStackTrace(); optsTmp.inSampleSize *= 2; try { input.close(); } catch (IOException e1) { e1.printStackTrace(); } } catch (FileNotFoundException e) { break; } } return bmp; } } }