android常用方法总结

public class Toolkit {

    /**
     *
     * Role:Telecom service providers获取手机服务商信息 <BR>
     *
     * 需要加入权限<uses-permission
     * android:name="android.permission.READ_PHONE_STATE"/> <BR>
     * Date:2012-3-12 <BR>
     *
     * @author CODYY)allen
     */
    public static String getProvidersName(Context context) {
        String ProvidersName = "nosim";
        try {
            // 返回唯一的用户ID;就是这张卡的编号神马的
            TelephonyManager telephonyManager = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);
            String IMSI = telephonyManager.getSubscriberId();
            // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。
            if (IMSI.startsWith("46000") || IMSI.startsWith("46002"))
                ProvidersName = "中国移动";
            else if (IMSI.startsWith("46001"))
                ProvidersName = "中国联通";
            else if (IMSI.startsWith("46003"))
                ProvidersName = "中国电信";
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return ProvidersName;
        }
        return ProvidersName;
    }

    /**
     * 获取手机号
     *
     * @param context
     * @return
     */
    public static String getPhone(Context context) {
        TelephonyManager phoneMgr = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        return phoneMgr.getLine1Number();
    }

    /**
     * 获取手机型号
     *
     * @return
     */
    public static String getPhoneType() {
        return Build.MODEL;
    }

    /**
     * 获取sdk版本
     *
     * @return
     */
    public static String getSDKVersion() {
        return Build.VERSION.SDK;
    }

    /**
     * 获取版本号
     *
     * @return
     */
    public static String getVersion() {
        return Build.VERSION.RELEASE;
    }

    public static class TelephonyManagerInfo {
        /**
         * 电话状态: 1.tm.CALL_STATE_IDLE=0 无活动
         *
         * 2.tm.CALL_STATE_RINGING=1 响铃
         *
         * 3.tm.CALL_STATE_OFFHOOK=2 摘机
         */
        public static int CallState;
        /**
         *
         * 电话方位:(需要权限:android.permission.ACCESS_COARSE_LOCATION)
         */
        public static String CellLocation;

        /**
         *
         * 唯一的设备ID:
         *
         * GSM手机的 IMEI 和 CDMA手机的 MEID.
         *
         * Return null if device ID is not available.
         */
        public static String DeviceId;

        /**
         *
         * 设备的软件版本号:
         *
         * 例如:the IMEI/SV(software version) for GSM phones.
         *
         * Return null if the software version is not available.
         */
        public static String DeviceSoftwareVersion;

        /**
         *
         * 手机号:
         *
         * GSM手机的 MSISDN.
         *
         * Return null if it is unavailable.
         */
        public static String Line1Number;

        /**
         *
         * 附近的电话的信息:
         *
         * 类型:List<NeighboringCellInfo>
         *
         * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES
         */
        public static List<NeighboringCellInfo> NeighboringCellInfo;// List<NeighboringCellInfo>

        /**
         *
         * 获取ISO标准的国家码,即国际长途区号。
         *
         * 注意:仅当用户已在网络注册后有效。
         *
         * 在CDMA网络中结果也许不可靠。
         */
        public static String NetworkCountryIso;

        /**
         *
         * MCC+MNC(mobile country code + mobile network code)
         *
         * 注意:仅当用户已在网络注册时有效。
         *
         * 在CDMA网络中结果也许不可靠。
         */
        public static String NetworkOperator;

        /**
         *
         * 按照字母次序的current registered operator(当前已注册的用户)的名字
         *
         * 注意:仅当用户已在网络注册时有效。
         *
         * 在CDMA网络中结果也许不可靠。
         */

        public static String NetworkOperatorName;// String

        /**
         * 当前使用的网络类型:
         *
         * 例如: NETWORK_TYPE_UNKNOWN 网络类型未知 0 NETWORK_TYPE_GPRS GPRS网络 1
         *
         * NETWORK_TYPE_EDGE EDGE网络 2
         *
         * NETWORK_TYPE_UMTS UMTS网络 3
         *
         * NETWORK_TYPE_HSDPA HSDPA网络 8
         *
         * NETWORK_TYPE_HSUPA HSUPA网络 9
         *
         * NETWORK_TYPE_HSPA HSPA网络 10
         *
         * NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4
         *
         * NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5
         *
         * NETWORK_TYPE_EVDO_A EVDO网络, revision A. 6
         *
         * NETWORK_TYPE_1xRTT 1xRTT网络 7
         */
        public static int NetworkType;// int

        /**
         *
         * 手机类型:
         *
         * 例如: PHONE_TYPE_NONE 无信号
         *
         * PHONE_TYPE_GSM GSM信号
         *
         * PHONE_TYPE_CDMA CDMA信号
         */

        public static int PhoneType;// int

        /**
         *
         * Returns the ISO country code equivalent for the SIM provider's
         * country code.
         *
         * 获取ISO国家码,相当于提供SIM卡的国家码。
         */
        public static String SimCountryIso;// String

        /**
         *
         * Returns the MCC+MNC (mobile country code + mobile network code) of
         * the provider of the SIM. 5 or 6 decimal digits.
         *
         * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.
         *
         * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
         */
        public static String SimOperator;// String

        /**
         *
         * 服务商名称:
         *
         * 例如:中国移动、联通
         *
         * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
         */
        public static String SimOperatorName;// String

        /**
         *
         * SIM卡的序列号:
         *
         * 需要权限:READ_PHONE_STATE
         */
        public static String SimSerialNumber;// String

        /**
         *
         * SIM的状态信息:
         *
         * SIM_STATE_UNKNOWN 未知状态 0
         *
         * SIM_STATE_ABSENT 没插卡 1
         *
         * SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2
         *
         * SIM_STATE_PUK_REQUIRED 锁定状态,需要用户的PUK码解锁 3
         *
         * SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4
         *
         * SIM_STATE_READY 就绪状态 5
         */
        public static int SimState;// int

        /**
         *
         * 唯一的用户ID:
         *
         * 例如:IMSI(国际移动用户识别码) for a GSM phone.
         *
         * 需要权限:READ_PHONE_STATE
         */
        public static String SubscriberId;// String

        /**
         *
         * 取得和语音邮件相关的标签,即为识别符
         *
         * 需要权限:READ_PHONE_STATE
         */
        public static String VoiceMailAlphaTag;// String

        /**
         *
         * 获取语音邮件号码:
         *
         * 需要权限:READ_PHONE_STATE
         */
        public static String VoiceMailNumber;// String

        /**
         *
         * ICC卡是否存在
         */
        public static boolean hasIccCard;// boolean

        /**
         *
         * 是否漫游:
         *
         * (在GSM用途下)
         */
        public static boolean isNetworkRoaming;
    }

    /**
     * 获取手机唯一ID
     *
     * @param context
     * @return
     */
    public static String getPhoneUniqueId(Context context) {
        TelephonyManager tm = (TelephonyManager) context
                .getSystemService(context.TELEPHONY_SERVICE);
        return tm.getDeviceId();
    }

    /**
     * 获取手机信息实体
     *
     * @param context
     * @return
     */
    public static TelephonyManagerInfo getTelephonyInfo(Context context) {
        TelephonyManagerInfo info = new TelephonyManagerInfo();
        TelephonyManager tm = (TelephonyManager) context
                .getSystemService(context.TELEPHONY_SERVICE);
        info.CallState = tm.getCallState();
        info.CellLocation = tm.getCellLocation().toString();
        info.DeviceId = tm.getDeviceId();
        info.DeviceSoftwareVersion = tm.getDeviceSoftwareVersion();
        info.hasIccCard = tm.hasIccCard();
        info.isNetworkRoaming = tm.isNetworkRoaming();
        info.Line1Number = tm.getLine1Number();
        info.NeighboringCellInfo = tm.getNeighboringCellInfo();
        info.NetworkCountryIso = tm.getNetworkCountryIso();
        info.NetworkOperator = tm.getNetworkOperator();
        info.NetworkOperatorName = tm.getNetworkOperatorName();
        info.NetworkType = tm.getNetworkType();
        info.PhoneType = tm.getPhoneType();
        info.SimCountryIso = tm.getSimCountryIso();
        info.SimOperator = tm.getSimOperator();
        info.SimOperatorName = tm.getSimOperatorName();
        info.SimSerialNumber = tm.getSimSerialNumber();
        info.SimState = tm.getSimState();
        info.SubscriberId = tm.getSubscriberId();
        info.VoiceMailAlphaTag = tm.getVoiceMailAlphaTag();
        info.VoiceMailNumber = tm.getVoiceMailNumber();
        return info;
    }

    /**
     * 取得屏幕分辨率大小
     *
     * @param context
     *            Activity上下文
     * @return第一个值为宽度
     */
    public static int[] getDisplayPixes(Activity context) {
        DisplayMetrics dm = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(dm);
        return new int[] { dm.widthPixels, dm.heightPixels };
    }

    /**
     * 取得屏幕分辨宽度和高度
     *
     * @param context
     *            Activity上下文
     * @return第一个值为宽度
     */
    public static int[] getDisplayWidthHeight(Activity context) {
        Display dis = context.getWindowManager().getDefaultDisplay();
        return new int[] { dis.getWidth(), dis.getHeight() };
    }

    /**
     * 检查是否有可用的网络
     *
     * @param context
     *            上下文
     * @return true:有网络
     */
    public static boolean isAvaliable(Context context) {
        if (isWiFiActive(context) || isNetworkAvailable(context))
            // Toast.makeText(context, "有网络!", 300).show();
            return true;
        else
            // Toast.makeText(context, "网络不正常!", 300).show();
            return false;
    }

    /** 返回当前网速 */
    public static long getNetworkSpeed() {
        // TODO Auto-generated method stub
        ProcessBuilder cmd;
        long readBytes = 0;
        BufferedReader rd = null;
        try {
            String[] args = { "/system/bin/cat", "/proc/net/dev" };
            cmd = new ProcessBuilder(args);
            Process process = cmd.start();
            rd = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
            String line;
            int linecount = 0;
            while ((line = rd.readLine()) != null) {
                linecount++;
                if (line.contains("wlan0") || line.contains("eth0")) {
                    // L.E("获取流量整条字符串",line);
                    String[] delim = line.split(":");
                    if (delim.length >= 2) {
                        String[] numbers = delim[1].trim().split(" ");// 提取数据
                        readBytes = Long.parseLong(numbers[0].trim());//
                        break;
                    }
                }
            }
            rd.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (rd != null) {
                try {
                    rd.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return readBytes;
    }

    /**
     * 检查wifi是否可用
     *
     * @param inContext
     * @return
     */
    public static boolean isWiFiActive(Context inContext) {
        WifiManager mWifiManager = (WifiManager) inContext
                .getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
        int ipAddress = wifiInfo == null ? 0 : wifiInfo.getIpAddress();
        if (mWifiManager.isWifiEnabled() && ipAddress != 0) {
            System.out.println("**** WIFI is on");
            return true;
        } else {
            System.out.println("**** WIFI is off");
            return false;
        }
    }

    /**
     * 检查手机网络(非wifi)是否有用
     *
     * @param context
     * @return
     */
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null) {
            return false;
        } else {
            NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (info == null) {
                return false;
            } else {
                if (info.isAvailable()) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断是否为wifi的连接ip
     *
     * @return
     */
    public static boolean isWifiConnected(Context context) {
        int ipAddress = getWifiIpInfo(context);
        if (ipAddress > 0)
            return true;
        else
            return false;
    }

    private static int getWifiIpInfo(Context context) {
        // 获取wifi服务
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
        // 判断wifi是否开启
        if (!wifiManager.isWifiEnabled()) {
            wifiManager.setWifiEnabled(true);
        }
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        // return String.valueOf(wifiInfo.getIpAddress());
        int ipAddress = wifiInfo.getIpAddress();
        return ipAddress;
    }

    /**
     * 获取wifi ip
     *
     * @return
     */
    public static String getWifiAddress(Context context) {
        int ipAddress = getWifiIpInfo(context);
        return intToIp(ipAddress);
    }

    private static String intToIp(int i) {
        return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF)
                + "." + (i >> 24 & 0xFF);
    }

    /**
     * 获取手机mac地址<br/>
     * 错误返回12个0
     */
    public static String getMacAddress(Context context) {
        // 获取mac地址:
        String macAddress = "000000000000";
        try {
            WifiManager wifiMgr = (WifiManager) context
                    .getSystemService(Context.WIFI_SERVICE);
            WifiInfo info = (null == wifiMgr ? null : wifiMgr
                    .getConnectionInfo());
            if (null != info) {
                if (!TextUtils.isEmpty(info.getMacAddress()))
                    macAddress = info.getMacAddress().replace(":", "");
                else
                    return macAddress;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return macAddress;
        }
        return macAddress;
    }

    /**
     * 获取手机ip(此方法在android中使用获取3G网络ip地址)
     *
     * @return
     * @throws SocketException
     * @throws UnknownHostException
     */
    public static String getLocalIpAddress() throws SocketException {
        for (Enumeration<NetworkInterface> en = NetworkInterface
                .getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr
                    .hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    return inetAddress.getHostAddress().toString();
                }
            }
        }
        return null;
    }

    /**
     * 获取本机ip(此方法仅在java程序中)
     *
     * @return
     * @throws UnknownHostException
     */
    public static String getHostAddress() throws UnknownHostException {
        InetAddress address = null;
        address = InetAddress.getLocalHost();
        return address.getHostAddress();
    }

    /**
     * 读取文本,一次读取多个字节,默认为1024
     *
     * @param file
     *            文件名称(在sd卡下面的data/data/应用程序包下面)
     * @param context
     *            上下文
     * @param encode
     *            编码方式
     * @return
     * @throws IOException
     */
    public static String readFromFileByChar(String file, Context context,
            String encode) throws IOException {
        FileInputStream fis = context.openFileInput(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(fis,
                encode));
        // Log.i(TAG, br.readLine());
        int index = 0;
        char[] buffer = new char[1024];// 一次性读取1024个字符
        StringBuffer sb = new StringBuffer();
        while ((index = br.read(buffer)) != -1) {// 一次读多个字符
            // 同样屏蔽掉r不显示
            if ((index == buffer.length) && (buffer[buffer.length - 1] != 'r')) {
                sb.append(buffer);
            } else {
                for (int i = 0; i < index; i++) {
                    if (buffer[i] == 'r') {
                        continue;// 停止执行当前的迭代,然后退回循环开始处
                    } else {
                        sb.append(buffer[i]);
                    }
                }
            }
        }
        br.close();
        fis.close();
        return sb.toString();
        // return br.readLine();
    }

    /**
     * 按行读取文本
     *
     * @param file
     *            文件名
     * @param context
     *            上下文
     * @param encode
     *            编码方式
     * @return
     * @throws IOException
     */
    public static String readFromFileByLine(String file, Context context,
            String encode) throws IOException {
        FileInputStream fis = context.openFileInput(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(fis,
                encode));
        // Log.i(TAG, br.readLine());
        StringBuffer sb = new StringBuffer();
        String temp;
        while ((temp = br.readLine()) != null) {// 一次读一行
            sb.append(temp);
        }
        br.close();
        fis.close();
        return sb.toString();
        // return br.readLine();
    }

    /**
     * 一次将string内容写入到文件
     *
     * @param context
     *            上下文
     * @param file
     *            文件名
     * @param content
     *            写入的内容
     * @throws IOException
     */
    public static void writeToFile(Context context, String file, String content)
            throws IOException {
        FileOutputStream fos = context.openFileOutput(file,
                context.MODE_PRIVATE);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
        bw.write(content);
        bw.flush();
        bw.close();
        fos.close();
    }

    /**
     * 将object序列化到filename文件中
     *
     * @param fileName
     *            文件名,包括路径
     * @param object
     *            序列化的对象
     */
    public static boolean writeFileByObject(String fileName, Object object) {
        try {
            FileOutputStream fos = new FileOutputStream(fileName);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(object);
            oos.flush();
            oos.close();
            fos.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 反序列化
     *
     * @param fileName
     *            文件名,包括详细路径
     * @return Object类型的对象
     */
    public static Object readFileByObject(String fileName) {
        try {
            FileInputStream fis = new FileInputStream(fileName);
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object o = ois.readObject();
            ois.close();
            fis.close();
            return o;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 按照指定的宽度和高度压缩图片(这是android 2.2以上才有的方法)
     *
     * @param bm
     * @param w
     * @param h
     * @return
     */
    public static Bitmap compressBitmap(Bitmap bm, int w, int h) {
        return ThumbnailUtils.extractThumbnail(bm, w, h);
    }

    /**
     * 等比例压缩图片
     *
     * @param is
     *            图片输入流
     * @param scalePix
     *            压缩的尺寸
     * @return
     */
    public static Bitmap compressBitmapByscale(InputStream is, int scalePix) {
        BitmapFactory.Options opt = new Options();
        opt.inSampleSize = scalePix;
        return BitmapFactory.decodeStream(is, null, opt);
    }

    /**
     * 等比例压缩图片
     *
     * @param data
     *            byte[]数组
     *
     * @param ratio
     *            压缩的尺寸
     * @return
     */
    public static Bitmap compressBitmap(byte[] data, int ratio) {
        BitmapFactory.Options opts = new Options();
        opts.inJustDecodeBounds = false;
        opts.inSampleSize = ratio;
        // 得到新的图片
        return BitmapFactory.decodeByteArray(data, 0, data.length, opts);

    }

    /**
     * 自动压缩图片(根据能够压缩的比例)
     *
     * @param map
     * @return
     */
    public static Bitmap compressBitmapAuto(Bitmap map, int scalePix) {
        BitmapFactory.Options opts = new BitmapFactory.Options();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        byte[] data = os.toByteArray();
        opts.inJustDecodeBounds = true;
        map.compress(CompressFormat.PNG, 100, os);
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        opts.inJustDecodeBounds = false;
        int be = (int) (opts.outHeight / (float) scalePix);
        if (be <= 0)
            be = 1;
        opts.inSampleSize = be;
        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
        return bitmap;
    }

    /** 根据屏幕大小适屏压缩 --2012/11/13-- */
    public static Bitmap compressBitmapFixDisplay(Activity context, byte[] data) {
        BitmapFactory.Options opts = new Options();
        opts.inJustDecodeBounds = true;// 设置查看图片的大小,不分配内存
        BitmapFactory.decodeByteArray(data, 0, data.length, opts);
        int height = context.getWindowManager().getDefaultDisplay().getHeight();// 获取屏幕大小
        int width = context.getWindowManager().getDefaultDisplay().getWidth();
        int hratio = (int) Math.ceil(opts.outHeight / (float) height);// 图片的高度比上屏幕的高度
        int wratio = (int) Math.ceil(opts.outWidth / (float) width);
        if (hratio > 1 || wratio > 1) {// 如果图片超出屏幕范围
            if (hratio > wratio)// 如果高度大于宽度
                opts.inSampleSize = hratio;
            else
                opts.inSampleSize = wratio;
        }
        opts.inJustDecodeBounds = false;// 设置分配图片的大小
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
                opts);
        return bitmap;
    }

    /**
     * 压缩图片
     *
     * @param bm
     *            所要转换的bitmap
     * @param newWidth新的宽
     * @param newHeight新的高
     * @return 指定宽高的bitmap
     */
    public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) {
        // 获得图片的宽高
        int width = bm.getWidth();
        int height = bm.getHeight();
        // 计算缩放比例
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 取得想要缩放的matrix参数
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        // 得到新的图片
        Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,
                true);
        if (!bm.isRecycled())// 回收bitmap
            bm.recycle();
        return newbm;
    }

    /**
     * 动态设置ImageView的布局宽度和高度
     *
     * @param iv
     *            ImageView对象
     * @param width
     *            要设置的宽度(0:充满父容器)
     * @param height
     *            要设置的高度(0:充满父容器)
     */
    public static void setImagePixes(ImageView iv, int width, int height) {
        ViewGroup.LayoutParams params = iv.getLayoutParams();
        if (width == 0 && height != 0)// 如果宽度为0
        {
            params.height = height;
            params.width = ViewGroup.LayoutParams.FILL_PARENT;
        } else if (height == 0 && width != 0) {// 高度为 0
            params.height = ViewGroup.LayoutParams.FILL_PARENT;
            params.width = width;
        } else if (width == 0 && height == 0) {
            params.height = ViewGroup.LayoutParams.FILL_PARENT;
            params.width = ViewGroup.LayoutParams.FILL_PARENT;
        } else {
            params.height = height;
            params.width = width;
        }
        iv.setLayoutParams(params);
    }

    /** activity转换为view */
    @SuppressWarnings("deprecation")
    public static View activityToView(Context parent, Intent intent) {
        LocalActivityManager mLocalActivityManager = new LocalActivityManager(
                (Activity) parent, true);
        final Window w = mLocalActivityManager.startActivity("TagName", intent);
        final View wd = w != null ? w.getDecorView() : null;
        if (wd != null) {
            wd.setVisibility(View.VISIBLE);
            wd.setFocusableInTouchMode(true);
            ((ViewGroup) wd)
                    .setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
        }
        return wd;
    }

    /***
     * 动态设置listview的高度
     *
     * @param listView
     */
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // params.height += 5;// if without this statement,the listview will be
        // a
        // little short
        // listView.getDividerHeight()获取子项间分隔符占用的高度
        // params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);
    }

    /**
     * 将Drawable转化为Bitmap
     *
     * @param drawable
     * @return
     */
    public static Bitmap drawableToBitmap(Drawable drawable) {
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
                .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, width, height);
        drawable.draw(canvas);
        return bitmap;
    }

    /**
     * 将图片的四角圆化
     *
     * @param bitmap
     * @param radius
     *            圆角弧度,数值越大弧度越大
     * @return
     */
    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int radius) {

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Config.ARGB_8888);
        // 得到画布
        Canvas canvas = new Canvas(output);

        // 将画布的四角圆化
        final int color = Color.RED;
        final Paint paint = new Paint();
        // 得到与图像相同大小的区域 由构造的四个值决定区域的位置以及大小
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        // 值越大角度越明显
        final float roundPx = radius;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        // drawRoundRect的第2,3个参数一样则画的是正圆的一角,如果数值不同则是椭圆的一角
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); // 设置形式为背景
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }

    /**
     * 获得带倒影的图片方法
     *
     * @param bitmap
     * @return
     */
    public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
        final int reflectionGap = 4;
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);
        Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,
                width, height / 2, matrix, false);
        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                (height + height / 2), Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(bitmap, 0, 0, null);
        Paint deafalutPaint = new Paint();
        canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);
        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
        Paint paint = new Paint();
        LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
                0x00ffffff, TileMode.CLAMP);
        paint.setShader(shader);// 设置阴影
        // Set the Transfer mode to be porter duff and destination in
        paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
        // Draw a rectangle using the paint with our linear gradient
        canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
                + reflectionGap, paint);
        return bitmapWithReflection;
    }

    /**
     * 向preferences写入数据
     *
     * @param context
     *            上下文
     * @param key
     *            键
     * @param value
     *            写入的内容
     */
    public static void writeToPreferences(Context context, String filename,
            String key, String value) {
        // 得到preferences对象
        SharedPreferences.Editor editor = context.getSharedPreferences(
                filename, android.content.Context.MODE_PRIVATE).edit();
        // editor = preferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /**
     * 向preference中读取数据 data/data/package/shared_prefs
     *
     * @param context
     *            上下文
     * @param filename
     *            文件名
     * @param key
     *            键
     * @param defaultValue
     *            默认值
     * @return
     */
    public static String readFromPreferences(Context context, String filename,
            String key, String defaultValue) {
        // 得到preferences对象
        SharedPreferences preferences = context.getSharedPreferences(filename,
                android.content.Context.MODE_PRIVATE
                        | android.content.Context.MODE_APPEND);
        return preferences.getString(key, defaultValue);
    }

    /**
     * 加载properties文件
     *
     * @param context
     * @param file
     * @return
     * @throws Exception
     */
    public static Properties loadProperties(Context context, String file,
            String encode) throws Exception {
        Properties properties = new Properties();
        FileInputStream s = new FileInputStream(file);
        properties.load(s);
        return properties;
    }

    /**
     * 保存到properties文件中
     *
     * @param context
     * @param file
     * @param properties
     * @throws Exception
     */
    public static void saveProperties(Context context, String file,
            String encode, Properties properties) throws Exception {
        FileOutputStream s = new FileOutputStream(file, false);
        properties.store(s, "");
    }

    // ---------------------------------------------------------------------------------------------------

    /**
     * 从网络上下载
     *
     * @param url
     * @return
     * @throws IOException
     */
    public static Bitmap getBitMapFromUrl(String url) throws IOException {
        Bitmap bitmap = null;
        URL u = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        u = new URL(url);
        conn = (HttpURLConnection) u.openConnection();
        is = conn.getInputStream();
        bitmap = BitmapFactory.decodeStream(is);
        return bitmap;
    }

    /**
     * 异步加载网络图片
     *
     * @param src图片路径
     * @param iv
     *            imageview
     * @param callback回调接口
     */
    public static void loadImage(final String src, final ImageView iv,
            final ImageCallBack callback) {
        final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                callback.setImageBitmap((Bitmap) msg.obj, iv, src);
            }
        };
        new Thread(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = null;
                try {
                    bitmap = getBitMapFromUrl(src);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (bitmap != null) {
                    Message msg = handler.obtainMessage(0, bitmap);
                    handler.sendMessage(msg);
                }
            }
        }).start();
    }

    /**
     * 获取网络byte流的图片
     *
     * @param src
     * @return
     * @throws Exception
     */
    public static byte[] getImageBytes(String src) throws Exception {
        URL url = new URL(src);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoInput(true);
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);// 设置延迟时间为5s
        InputStream is = conn.getInputStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = is.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        return bos.toByteArray();
    }

    /**
     * 压缩图片
     *
     * @param bm
     *            所要转换的bitmap
     * @param newWidth新的宽
     * @param newHeight新的高
     * @return 指定宽高的bitmap
     */
    public static Bitmap zoomBitmap(byte[] data, int newWidth, int newHeight) {
        BitmapFactory.Options opts = new Options();
        opts.inJustDecodeBounds = false;
        opts.inSampleSize = 10;
        // 得到新的图片
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
                opts);
        // 获得图片的宽高
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        // 计算缩放比例
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 取得想要缩放的matrix参数
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);

        Bitmap newbm = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix,
                true);
        if (!bitmap.isRecycled())// 回收bitmap
            bitmap.recycle();
        return newbm;
    }

    /**
     * 异步加载网络图片
     *
     * @param src
     *            url地址
     * @param iv
     *            传入的iamgeView
     * @param callback
     *            回调函数
     */
    public static void AsycloadImage(final String src, final ImageView iv,
            final ImageCallBack callback) {
        final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                callback.setImageBitmap((Bitmap) msg.obj, iv, src);
            }
        };
        new Thread(new Runnable() {
            @Override
            public void run() {
                byte[] data = null;
                Bitmap bitmap = null;
                try {
                    data = getImageBytes(src);
                    bitmap = compressBitmap(data, 3);

                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (bitmap != null) {
                    Message msg = handler.obtainMessage(0, bitmap);
                    handler.sendMessage(msg);
                }
            }
        }).start();
    }

    /**
     * 异步加载图片
     *
     * @param url
     *            图片路径
     * @param iv
     *            ImageView
     * @param imgCache
     *            缓存
     * @param callback
     *            回调接口
     */
    public static void AyncLoadImageFromUrl(final String url,
            final ImageView iv,
            final Map<String, SoftReference<Bitmap>> imgCache,
            final ImageCallBack callback) {
        if (imgCache.containsKey(url))// 如果缓存中存在
        {
            iv.setImageBitmap(imgCache.get(url).get());
            return;
        }
        final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                callback.setImageBitmap((Bitmap) msg.obj, iv, url);
            }
        };
        new Thread(new Runnable() {

            @Override
            public void run() {
                byte[] data = null;
                Bitmap bitmap = null;
                try {
                    data = getImageBytes(url);
                    bitmap = compressBitmap(data, 3);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (bitmap != null) {
                    // 保存到缓存中
                    // 将图片保存到缓存中
                    imgCache.put(url, new SoftReference<Bitmap>(bitmap));
                    Message msg = handler.obtainMessage(0, bitmap);
                    handler.sendMessage(msg);
                }
            }
        }).start();
    }

    /**
     * 保存图片到sdcard,并且返回图片名称,带后缀名
     *
     * @param context
     * @param fileName
     *            图片目录名称
     * @param photo
     *            图片路径
     * @throws IOException
     */
    public static String saveImgToSdcard(Context context, String fileName,
            String photo) throws IOException {
        String url = photo;
        // 获取图片名称,包含后缀
        String imgName = url.substring(url.lastIndexOf("/") + 1, url.length());
        URL Url = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
        InputStream is = conn.getInputStream();
        String saveUrl = context.getFilesDir() + "/" + fileName + "/" + imgName;
        File file = new File(saveUrl);
        // 如果图片文件存在
        if (file.exists())
            return imgName;
        FileOutputStream fos = new FileOutputStream(file);
        byte[] data = new byte[512];
        int len = 0;
        while ((len = is.read(data)) != -1) {
            fos.write(data, 0, len);
        }
        fos.flush();
        fos.close();
        return imgName;
    }

    /**
     * 保存图片到指定的目录
     *
     * @param context
     *            上下文
     * @param filedir
     *            图片目录名称
     * @param name
     *            图片名称
     * @param bitmap
     *            图片
     * @throws Exception
     */
    public static void saveBitmapToSdcard(Context context, String filedir,
            String name, Bitmap bitmap) throws Exception {
        String path = context.getFilesDir() + File.separator + filedir
                + File.separator;
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }
        file = new File(path + name + ".png");
        if (file.exists())
            return;
        FileOutputStream fos = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.close();
    }

    /** 从sdcard制定目录读取图片 */
    public static Bitmap getBitmapFromSdcard(Context context, String file,
            String name) {
        String src = context.getFilesDir() + "/" + file + "/" + name;
        Bitmap bitmap = BitmapFactory.decodeFile(src);
        return bitmap;
    }

    /**
     * 从缓存中读取
     *
     * @param url
     * @return
     * @throws Exception
     */
    public static Bitmap getImgFromCache(final String url, final ImageView iv,
            final Map<String, SoftReference<Bitmap>> imgCache,
            final ImageCallBack callback) throws Exception {
        // 从内存中读取
        if (imgCache.containsKey(url)) {
            synchronized (imgCache) {
                SoftReference<Bitmap> bitmapReference = imgCache.get(url);
                if (null != bitmapReference) {
                    return bitmapReference.get();
                }
            }
        }
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                callback.setImageBitmap((Bitmap) msg.obj, iv, url);
            }
        };
        // �木W�j中下�d
        new Thread(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = null;
                try {
                    bitmap = getBitMapFromUrl(url);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 将图片保存进内存中
                imgCache.put(url, new SoftReference<Bitmap>(bitmap));
                Message msg = handler.obtainMessage(0, bitmap);
                handler.sendMessage(msg);
            }
        }).start();
        return null;
    }

    public interface ImageCallBack {
        public void setImageBitmap(Bitmap bitmap, ImageView iv, String url);
    }

    /**
     * get 请求
     *
     * @param url路径
     * @return
     * @throws Exception
     * @throws ClientProtocolException
     */
    public static HttpResponse get(String url) throws Exception {
        HttpResponse response = null;
        HttpClient client = new DefaultHttpClient();
        // 设置连接超时
        client.getParams().setIntParameter(
                HttpConnectionParams.CONNECTION_TIMEOUT, 10000);
        // 设置编码
        // client.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET,
        // "gb2312");
        // get方式
        HttpGet httpRequest = new HttpGet(url);
        // 发出一个request,并返回一个基于http协议的response
        // System.out.println("------toolkit 1066----------");
        response = client.execute(httpRequest);
        return response;
    }

    /**
     * post请求
     *
     * @param path
     *            请求的地址
     * @param params
     *            参数列表
     * @return
     * @throws Exception
     */
    public static InputStream postRequest(String path,
            Map<String, String> params) throws Exception {
        // 封装请求参数
        List<NameValuePair> pair = new ArrayList<NameValuePair>();
        if (params != null && !params.isEmpty()) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                pair.add(new BasicNameValuePair(entry.getKey(), entry
                        .getValue()));
            }
        }
        // 把请求参数变成请求体部分
        UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");       
       
       
        // 使用HttpPost对象设置发送的URL路径
        final HttpPost post = new HttpPost(path);
        // 发送请求体
        post.setEntity(uee);
        // 创建一个浏览器对象,以把POST对象向服务器发送,并返回响应消息
        DefaultHttpClient dhc = new DefaultHttpClient();
        // 设置连接超时
        dhc.getParams().setIntParameter(
                HttpConnectionParams.CONNECTION_TIMEOUT, 10000);
        dhc.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT, 10000); // 设置等待数据超时10s
        HttpResponse response = dhc.execute(post);
        Log.e("TAG", "服务器返回状态:----" + response.getStatusLine().getStatusCode());
        if (response != null && response.getStatusLine().getStatusCode() == 200) {
            return response.getEntity().getContent();
        } else
            post.abort();
        return null;
    }

    /**
     * post请求
     *
     * @param url路径
     * @param list
     *            参数列表
     * @return
     * @throws IOException
     * @throws ClientProtocolException
     */
    public static HttpResponse post(String url, List<BasicNameValuePair> list,
            String encode) throws Throwable {
        HttpResponse response = null;
        HttpClient client = new DefaultHttpClient();
        // 设置连接超时
        client.getParams().setIntParameter(
                HttpConnectionParams.CONNECTION_TIMEOUT, 5000);
        client.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,
                5000); // 设置等待数据超时5s
        // 创建一个 基于http协议的请求(post方式)
        HttpPost httpRequest = new HttpPost(url);
        if (list != null) {
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode);
            // 将请求中的参数信息放置到request中
            httpRequest.setEntity(entity);
        }
        // 发出一个request,并返回一个基于http协议的response
        response = client.execute(httpRequest);
        return response;

    }

    /*
     * 参数说明: uploadUrl: Servlet的url fileName: 上传图片的文件名(如: qq.png) fileUrl:
     * 上传文件在手机客户端的完整路径(如: /sdcard/qq.png)
     */
    public static InputStream upload(String uploadUrl, String fileName,
            String fileUrl) throws Exception {
        String end = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        InputStream is = null;
        URL url = new URL(uploadUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        /* 允许Input、Output,不使用Cache */
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        /* 设置传送的method=POST */
        conn.setRequestMethod("POST");
        /* setRequestProperty */
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Charset", "UTF-8");
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="
                + boundary);
        // 将phone放置到请求的头部

        if (fileName != null && fileUrl != null) {
            conn.setRequestProperty("picName", fileName);
            /* 设置DataOutputStream */
            DataOutputStream ds = new DataOutputStream(conn.getOutputStream());
            ds.writeBytes(twoHyphens + boundary + end);
            ds.writeBytes("Content-Disposition: form-data; "
                    + "name=\"file1\";filename=\"" + fileName + "\"" + end);
            ds.writeBytes(end);

            /* 取得文件的FileInputStream */
            FileInputStream fStream = new FileInputStream(fileUrl);
            /* 设置每次写入1024bytes */
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];

            int length = -1;
            /* 从文件读取数据至缓冲区 */
            while ((length = fStream.read(buffer)) != -1) {
                /* 将资料写入DataOutputStream中 */
                ds.write(buffer, 0, length);
            }
            ds.writeBytes(end);
            ds.writeBytes(twoHyphens + boundary + twoHyphens + end);

            /* close streams */
            fStream.close();
            ds.flush();
            ds.close();
        }
        /* 取得Response内容 */
        is = conn.getInputStream();
        return is;
    }

    // -------------------------------------加密,验证,转换系列-----------------------------------------------------------
    /**
     * 验证是否为手机号码
     *
     * @param mobiles
     * @return
     */
    public static boolean isMobileNO(String mobiles) {
        // Pattern p =
        // Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,1,2,5-9]))\\d{8}$");
        Pattern p = Pattern.compile("^([0-9]{3})\\d{8}$");
        Matcher m = p.matcher(mobiles);
        return m.matches();
    }

    /**
     * 验证输入是否为邮箱
     *
     * @param strEmail
     * @return
     */
    public static boolean isEmail(String strEmail) {
        String strPattern = "^[a-zA-Z][\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]$";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(strEmail);
        return m.matches();
    }

    /**
     * 验证输入是否6位数字
     *
     * @param strEmail
     * @return
     */
    public static boolean isCode(String strCode) {
        String strPattern = "^[0-9]{6}";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(strCode);
        return m.matches();
    }

    /**
     * 验证输入是否6位字符包含数字和字母,不包含特殊字符
     *
     * @param strEmail
     * @return
     */
    public static boolean isCheckCode(String strCode) {
        String strPattern = "^[0-9a-zA-Z]{6}";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(strCode);
        return m.matches();
    }

    /**
     * 验证输入是否6到12位上字符包含数字和字母,包含特殊字符
     *
     * @param strEmail
     * @return
     */
    public static boolean isPassCode(String strCode) {
        String strPattern = "^[0-9a-zA-Z@*%#()><!_~]{6,12}";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(strCode);
        return m.matches();
    }

    /**
     * 过滤url
     *
     * @param str
     * @return
     */
    public static boolean isLegalUrlParameters(String str) {
        String strPattern = "[&=\\s]+";
        Pattern p = Pattern.compile(strPattern);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 验证ip
     *
     * @param text
     * @return
     */
    public static boolean isIp(String text) {
        if (text != null && text != "") {
            // 定义正则表达式
            String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
                    + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
                    + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
                    + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
            // 判断ip地址是否与正则表达式匹配
            if (text.matches(regex)) {
                // 返回判断信息
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

    /**
     * md5加密
     *
     * @param s
     * @return
     * @throws Exception
     */
    public final static String MD5(String s) throws Exception {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f' };

        byte[] strTemp = s.getBytes();
        MessageDigest mdTemp = MessageDigest.getInstance("MD5");
        mdTemp.update(strTemp);
        byte[] md = mdTemp.digest();
        int j = md.length;
        char str[] = new char[j * 2];
        int k = 0;
        for (int i = 0; i < j; i++) {
            byte byte0 = md[i];
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            str[k++] = hexDigits[byte0 & 0xf];
        }
        return new String(str);
    }

    /**
     * 加密
     *
     * @param sSrc
     *            原文
     * @param sKey
     *            密码是16位
     * @return
     * @throws Exception
     */
    public static String AESEncrypt(String sSrc, String sKey) throws Exception {
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print("Key无效");
            return null;
        }
        byte[] raw = sKey.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes());
        return byte2hex(encrypted).toLowerCase();
    }

    /**
     * 解密
     *
     * @param sSrc
     * @param sKey密码是16位
     * @return
     * @throws Exception
     */
    public static String AESDecrypt(String sSrc, String sKey) throws Exception {
        // 判断Key是否正确
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print("Key无效");
            return null;
        }
        byte[] raw = sKey.getBytes("ASCII");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] encrypted1 = hex2byte(sSrc);
        byte[] original = cipher.doFinal(encrypted1);
        String originalString = new String(original);
        return originalString;
    }

    private static final byte[] HEX_CHAR_TABLE = { (byte) '0', (byte) '1',
            (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6',
            (byte) '7', (byte) '8', (byte) '9', (byte) 'A', (byte) 'B',
            (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F' };

    /**
     * 十六进制无符号整数形式
     *
     * @param raw
     * @param len
     * @return
     */
    public static String getHex(byte[] raw, int len) {
        byte[] hex = new byte[2 * len];
        int index = 0;
        int pos = 0;

        for (byte b : raw) {
            if (pos >= len)
                break;

            pos++;
            int v = b & 0xFF;
            hex[index++] = HEX_CHAR_TABLE[v >>> 4];
            hex[index++] = HEX_CHAR_TABLE[v & 0xF];
        }
        return new String(hex);
    }

    /**
     * 转换为10进制无符号字符串
     *
     * @param bytes
     * @return
     */
    public static long getDec(byte[] bytes) {
        long result = 0;
        long factor = 1;
        for (int i = 0; i < bytes.length; ++i) {
            long value = bytes[i] & 0xffl;
            result += value * factor;
            factor *= 256l;
        }
        return result;
    }

    /**
     * 二进制转换为16进制
     *
     * @param b
     * @return
     */
    public static String byte2hex(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
        }
        return hs.toUpperCase();
    }

    /**
     * 16进制转换为二进制
     *
     * @param strhex
     * @return
     */
    public static byte[] hex2byte(String strhex) {
        if (strhex == null) {
            return null;
        }
        int l = strhex.length();
        if (l % 2 == 1) {
            return null;
        }
        byte[] b = new byte[l / 2];
        for (int i = 0; i != l / 2; i++) {
            b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2),
                    16);
        }
        return b;
    }

    /**
     * 16进制字符转换为int
     *
     * @param c
     * @return
     */
    public static int reverseToInt(char c) {
        if (c == 'A')
            return 10;
        else if (c == 'B')
            return 11;
        else if (c == 'C')
            return 12;
        else if (c == 'D')
            return 13;
        else if (c == 'E')
            return 14;
        else if (c == 'F')
            return 15;
        else
            return Integer.parseInt(String.valueOf(c));
    }

    /**
     * 16进制加法
     *
     * @param src1
     * @param src2
     * @return
     */
    public static String hexAdd(String src1, String src2) {
        int length1 = src1.toUpperCase().length();
        int length2 = src2.toUpperCase().length();
        String extend = "";
        char sum[] = null;
        if (length1 > length2) {// 如果src1的长度大于src2
            int num = length1 - length2;
            sum = new char[length1];
            String zero = "";
            for (int i = 0; i < num; i++) {
                zero += "0";
            }
            src2 = zero + src2;
            // 遍历数组,然后相加
            int add = 0, rest = 0;
            for (int i = length1 - 1; i >= 0; i--) {
                int a = reverseToInt(src1.toUpperCase().charAt(i));
                int b = reverseToInt(src2.toUpperCase().charAt(i));
                if (a + b + add >= 16) {
                    int temp = add;
                    add = (a + b + add) / 16;
                    rest = (a + b + temp) % 16;
                    sum[i] = reverseToChar(rest);
                } else {
                    sum[i] = reverseToChar(a + b + add);
                    add = 0;
                }
            }
        } else if (length1 < length2) {// src1的长度小于src2
            int num = length2 - length1;
            sum = new char[length2];
            String zero = "";
            for (int i = 0; i < num; i++) {
                zero += "0";
            }
            src1 = zero + src1;
            // 遍历数组,然后相加
            int add = 0, rest = 0;
            for (int i = length2 - 1; i >= 0; i--) {
                int a = reverseToInt(src1.toUpperCase().charAt(i));
                int b = reverseToInt(src2.toUpperCase().charAt(i));
                if (a + b + add >= 16) {
                    int temp = add;
                    add = (a + b + add) / 16;
                    rest = (a + b + temp) % 16;
                    sum[i] = reverseToChar(rest);
                } else {
                    sum[i] = reverseToChar(a + b + add);
                    add = 0;
                }
            }
        } else {// 如果相等
            // 遍历数组,然后相加
            sum = new char[length2];
            int add = 0, rest = 0;
            for (int i = length2 - 1; i >= 0; i--) {
                int a = reverseToInt(src1.toUpperCase().charAt(i));
                int b = reverseToInt(src2.toUpperCase().charAt(i));
                if (a + b + add >= 16) {
                    int temp = add;
                    add = (a + b + add) / 16;
                    rest = (a + b + temp) % 16;
                    sum[i] = reverseToChar(rest);
                    if (i == 0) {// 如果i==0
                        extend = String.valueOf(add);
                    }
                } else {
                    sum[i] = reverseToChar(a + b + add);
                    add = 0;
                }
            }
        }
        return extend + String.valueOf(sum);
    }

    /**
     * 整形转为16进制表示的char
     *
     * @param num
     * @return
     */
    public static char reverseToChar(int num) {
        /*
         * if (num == 10) return 'A'; else if (num == 11) return 'B'; else if
         * (num == 12) return 'C'; else if (num == 13) return 'D'; else if (num
         * == 14) return 'E'; else if (num == 15) return 'F'; else return
         * String.valueOf(num).charAt(0);
         */
        return Integer.toHexString(num).charAt(0);
    }

    /**
     * 16进制字符按位取反
     *
     * @param num
     * @return
     */
    public static String revers(String num) {
        num = num.toUpperCase();
        char array[] = num.toCharArray();
        for (int i = 0; i < array.length; i++) {
            if (array[i] == 'A')
                array[i] = reverseToChar(15 - 10);
            else if (array[i] == 'B')
                array[i] = reverseToChar(15 - 11);
            else if (array[i] == 'C')
                array[i] = reverseToChar(15 - 12);
            else if (array[i] == 'D')
                array[i] = reverseToChar(15 - 13);
            else if (array[i] == 'E')
                array[i] = reverseToChar(15 - 14);
            else if (array[i] == 'F')
                array[i] = reverseToChar(15 - 15);
            else
                array[i] = reverseToChar(15 - Integer.parseInt(String
                        .valueOf(array[i])));
        }
        //
        return String.valueOf(array);
    }

    /**
     * 输入流转换为byte数组
     *
     * @param is
     * @return
     * @throws IOException
     */
    public static byte[] streamToBytes(InputStream is) throws IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];

        int len;
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        return os.toByteArray();
    }

    /**
     * 将输入流转为字符串
     *
     * @param is
     *            输入流
     * @param encode
     *            编码方式
     * @return
     * @throws Exception
     */
    public static String streamToString(InputStream is, String encode)
            throws Exception {

        byte[] data = streamToBytes(is);
        return new String(data, encode);
    }

    /**
     * 将String转换成InputStream
     *
     * @param in
     * @return
     * @throws UnsupportedEncodingException
     * @throws Exception
     */
    public static InputStream StringTOInputStream(String in, String encode)
            throws IOException {
        ByteArrayInputStream is = new ByteArrayInputStream(in.getBytes(encode));
        return is;
    }

    /**
     * 将byte数组转换为输入流
     *
     * @param data
     * @return
     */
    public static InputStream ByteToStream(byte[] data) {
        ByteArrayInputStream os = new ByteArrayInputStream(data);
        return os;
    }

    /**
     * 资源文件转换为bitmap
     *
     * @param context
     * @param resId
     * @return
     */
    public static Bitmap getBitmapFromResource(Context context, int resId) {
        InputStream is = context.getResources().openRawResource(resId);
        return BitmapFactory.decodeStream(is);
    }

    /**
     * 返回当前日期xxxx年x月xx日x星期
     *
     * @return
     */
    public static String getDate() {
        Date date = new Date();
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        int w = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
            w = 0;
        }
        String mDate = c.get(Calendar.YEAR) + "年" + c.get(Calendar.MONTH) + "月"
                + c.get(Calendar.DATE) + "日  " + weekDays[w];
        return mDate;
    }
}


你可能感兴趣的:(android,code,service)