Android全面的项目工具类,我替你总结了

在平时的项目开发中,总有那么一个包是必不可少的。我要说的就是utils包。没了这个,代码怎么公用,功能怎么公用,所谓磨刀不误砍柴工,充分的准备是快速开发的前提。utils包对项目而言,就像人体的肺,没了肺,怎么呼吸?今天,老夫就将我珍藏多年的...,不是,积累的工具类我替你总结了,看你手指精奇,是个写程序的奇才,拿走不谢,持续更新中。

github代码直通车

啥也不说了,先上效果图:


文件列表

1.Bitmap处理工具类:包括bitmap保存本地;bytebuffer转bitmap;对bitmap高效高斯模糊;bitmap二次采样;bitmap图片压缩;

public class BitmapUtils {

    /**
     * 将bitmap保存为文件
     * @param bitmap
     * @param file
     * @return
     */
    public static boolean bitmapToFile(Bitmap bitmap, File file) {
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 将byteBuffer转为Bitmap
     * @param byteBuffer
     * @param width
     * @param height
     * @return
     */
    public static Bitmap byteBufferToBitmap(ByteBuffer byteBuffer, int width, int height) {
        IntBuffer intBuffer = byteBuffer.asIntBuffer();
        final int[] ret = new int[byteBuffer.limit() / 4];
        IntBuffer retBuffer = IntBuffer.wrap(ret);
        retBuffer.put(intBuffer);

        for (int i = 0; i < ret.length; i++) {
            int src = ret[i];
            int dest = (src & 0xFF) << 24 | (src & 0xFF000000) >> 8 | (src & 0xFF0000) >> 8 | (src & 0xFF00) >> 8;
            ret[i] = dest;
        }

        Bitmap bitmap = Bitmap.createBitmap(ret, width, height, Bitmap.Config.ARGB_8888);
        return bitmap;
    }

    /**
     * 高效率Bitmap高斯模糊
     * 还需在build.gradle加入 defaultConfig {
        renderscriptTargetApi 19
        renderscriptSupportModeEnabled true
     }
     * @param context
     * @param ivBlurBg
     * @param bitmap
     * param scaleRatio  bitmap分辨率缩小比例,计算速度更快,范围 1-10
     *
     */
    public static void bitmapBlur(Context context, ImageView ivBlurBg, Bitmap bitmap, int scaleRatio){
        int x = (int) ivBlurBg.getX();
        int y = (int) ivBlurBg.getY();
        int bitmapX = bitmap.getWidth();
        int bitmapY = bitmap.getHeight();
        Bitmap bitmapNew = Bitmap.createBitmap(bitmap,x,y,bitmapX-x,bitmapY-y);

        if(bitmap != null){
            Bitmap overlay = Bitmap.createScaledBitmap(bitmapNew, bitmapNew.getWidth() / scaleRatio, bitmapNew.getHeight() / scaleRatio, false);
            overlay = handleGlassblur(context,overlay,15);
            ivBlurBg.setImageBitmap(overlay);
        }
        bitmap.recycle();
    }

    public static Bitmap handleGlassblur(Context context, Bitmap originBitmap, int radius){
        RenderScript renderScript = RenderScript.create(context);
        Allocation input = Allocation.createFromBitmap(renderScript,originBitmap);
        Allocation output = Allocation.createTyped(renderScript,input.getType());
        ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
        scriptIntrinsicBlur.setRadius(radius);
        scriptIntrinsicBlur.setInput(input);
        scriptIntrinsicBlur.forEach(output);
        output.copyTo(originBitmap);

        return originBitmap;
    }

    /**
     * 根据指定的宽、高,对图片进行二次采样
     * @param bytes
     * @return
     */
    public static Bitmap ScaleBitmap(byte[] bytes,int width,int height){
        //获取图片的解码参数设置
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true仅仅解码图片的边缘
        options.inJustDecodeBounds = true;
        //对图片进行解码,如果指定了inJustDecodeBounds=true,decodeByteArray将返回为空
        BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
        int outWidth = options.outWidth;
        int outHeight = options.outHeight;

        int sampleSizeX = width/outWidth;
        int sampleSizeY = height/outHeight;
        int simpleSize = sampleSizeX < sampleSizeY ? sampleSizeX : sampleSizeY;
        //设置inJustDecodeBounds为false重新将图片读进内存中
        options.inJustDecodeBounds = false;
        //实际要进行缩放的比例
        options.inSampleSize = simpleSize;
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
    }

    /**
     * 图片质量压缩
     * @param bitmap  需要质量压缩的图片
     * @param size    指定最大要压缩成的大小,单位为k
     * @return
     */
    public static Bitmap compressBitmap(Bitmap bitmap,int size){
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //将压缩后的数据放入bos中
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,bos);
        int quality = 100;
        while(bos.toByteArray().length / 1024 > size){
            //循环判断如果压缩后的图片大于100k,则清空bos,质量压缩比减小10%
            bos.reset();
            quality -= 10;
            bitmap.compress(Bitmap.CompressFormat.JPEG,quality,bos);
        }
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        //通过字节输入流转为bitmap
        return BitmapFactory.decodeStream(bis,null,null);
    }

}

2.万能接口回调类,一个类能回调任何数据类型,从此不需要再创建其他单一回调接口。

public abstract class CallBackimpl implements IcallBack{

    @Override
    public void callBack(List datas) {

    }

    @Override
    public void callBack(List list, boolean charge) {

    }

    @Override
    public void callBack(String str) {

    }

    @Override
    public void callBack(String str, int code) {

    }

    @Override
    public void callBack(byte[] bytes) {

    }

    @Override
    public void callBack(Bitmap bitmap) {

    }

    @Override
    public void confirmHandle() {

    }

    @Override
    public void callBack(int progress) {

    }

    @Override
    public void callBack(float num) {

    }

    @Override
    public void callBack(int page,int subpage) {

    }

    @Override
    public void callBack(boolean boo) {

    }

    @Override
    public void callBack(JSONObject obj) {

    }

    @Override
    public void callBack(String... args) {

    }

    @Override
    public void onFail() {

    }
}

3.异常崩溃处理类:当程序发生未处理异常时,该类将版本号,版本名,设备号,Android版本,生产信息进行记录日志并发送至服务器。

public class CrashHandler implements Thread.UncaughtExceptionHandler{

    private Thread.UncaughtExceptionHandler exceptionHandler;
    private MyApp myApp;
    /** 错误日志保存名称 */
    private Map<String, String> infos = new HashMap<>();
    /** 错误日志文件名 */
    private final String LOGFILE_NAME = FileUtils.getCacheDir() + "crash.txt";

    public CrashHandler(MyApp myApp){
        exceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
        this.myApp = myApp;
    }

    /**
     * 当未捕获的异常发生时会传入此方中处理
     * @param thread
     * @param ex
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if(!handException(ex) && exceptionHandler != null){
            exceptionHandler.uncaughtException(thread,ex);
        }else{
            //异常处理并结束程序
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }

    /**
     * 异常处理方法,处理了返回true,未处理返回false
     * @param ex  异常
     * @return
     */
    private boolean handException(final Throwable ex){
        if(ex == null) return true;
        ex.printStackTrace();
        Toast.makeText(myApp, "应用发生异常,即将退出!", Toast.LENGTH_LONG).show();
        collectVersionInfo(myApp);
        collectDeviceInfo();
        saveCrashInfoToFile(ex);
        return true;
    }

    /**
     * 收集版本信息信息
     * @param context
     */
    private void collectVersionInfo(Context context) {
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
            if (pi != null) {
                String versionName = pi.versionName == null ? "null" : pi.versionName;
                String versionCode = pi.versionCode + "";
                infos.put("versionName", versionName);
                infos.put("versionCode", versionCode);
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 保存错误日志到文件中
     * @param ex
     */
    private void saveCrashInfoToFile(Throwable ex) {
        //换行符
        String lineFeed = "\r\n";
        StringBuffer sb = new StringBuffer();
        for(Map.Entry<String,String> entry: infos.entrySet()){
            String key = entry.getKey();
            String value = entry.getValue();
            sb.append(key + "=" + value + lineFeed);
        }

        StackTraceElement[] stack = ex.getStackTrace();
        String message = ex.getMessage();
        //准备错误日志文件
        File logFile = new File(LOGFILE_NAME);
        if(!logFile.getParentFile().exists()){
            logFile.getParentFile().mkdirs();
        }
        //写入错误日志
        FileWriter writer = null;
        try {
            //获取当前时间、异常message信息,异常栈跟踪信息写入日志文件
            writer = new FileWriter(logFile);
            writer.write("创建时间:" + StrUtils.currentTime("yy-MM-dd hh:mm:ss").toString()+lineFeed+lineFeed);
            writer.write(message+lineFeed);
            for(int i=0;i<stack.length;i++){
                writer.write(stack[i].toString() + lineFeed);
            }
            writer.write(lineFeed);
            writer.write(sb.toString());
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(null != writer){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * 根据Build类搜集设备信息
     */
    private void collectDeviceInfo(){
        Field[] fields = Build.class.getDeclaredFields();
        for(Field field : fields){
            try {
                field.setAccessible(true);
                infos.put(field.getName(),field.get(null).toString());
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

}

4.简单的下载工具类,也可以用封装的okhttp下载工具,亲测都好用。

public class DownLoadUtils {

    /**
     * 带最大值,进度值,结果的下载
     * @param url
     * @param maxLen
     * @param progress
     * @param result
     */
    public static void downloadFile(final String url, final CallBackimpl maxLen, final CallBackimpl progress, final CallBackimpl result){
        new Thread(){
            @Override
            public void run() {
                try {
                    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                    if(conn.getResponseCode() == 200){
                        InputStream inputStream = conn.getInputStream();
                        byte[] bytes = new byte[1024 * 500];
                        int len = -1;
                        maxLen.callBack(conn.getContentLength());
                        int currentLen = 0;  //当前进度
                        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        while((len = inputStream.read(bytes)) != -1){
                            baos.write(bytes,0,len);
                            currentLen+=len;
                            progress.callBack(currentLen);
                        }
                        result.callBack(baos.toByteArray());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    /**
     * 下载方法
     * @param url  地址
     * @param callBackimpl  下载完成回调
     */
    public static void downloadFile(final String url, final String fileName, final CallBackimpl callBackimpl){
        new Thread(){
            @Override
            public void run() {
                try {
                    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                    if(conn.getResponseCode() == 200){
                        InputStream inputStream = conn.getInputStream();
                        byte[] bytes = new byte[1024];
                        int len = -1;
                        File file = new File(fileName);
                        if(!file.getParentFile().exists()){
                            file.getParentFile().mkdirs();
                        }
                        FileOutputStream fos = new FileOutputStream(fileName);
                        while((len = inputStream.read(bytes)) != -1){
                            fos.write(bytes, 0, len);
                        }
                        fos.close();
                        callBackimpl.confirmHandle();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

}

5.文件操作工具类:包括判断sd卡可用;获取项目根目录;数据写文件;获取文件大小;删除文件;从raw资源文件读取到流;判断空间是否足够。

public class FileUtils {

    /**
     * 判断sd卡是否可用
     * @return
     */
    public static boolean isHaveSDcard(){
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }

    /**
     * 设置App缓存根目录
     * @return
     */
    public static String getCacheDir(){
        String sdDir = null;
        if(isHaveSDcard()){
            sdDir = Environment.getExternalStorageDirectory().getPath() + "/AppName/";
        }
        return sdDir;
    }

    /**
     * 将data数据写入指定文件里
     * @param data
     * @param fileName
     * @throws IOException
     */
    public static void saveFileToSDcard(byte[] data,String fileName){
        String filePath = getCacheDir();
        File dir = new File(filePath);
        if(!dir.exists()){
            dir.mkdirs();
        }
        File file = new File(filePath+"/"+fileName);
        try {
            if(!file.exists()){
                file.createNewFile();
                FileOutputStream fos = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                bos.write(data);
                bos.flush();
                bos.close();
                fos.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 递归累计获取文件/文件夹大小
     * @param f
     * @return
     * @throws Exception
     */
    public static long getFileSize(File f) throws Exception {
        long size = 0;
        File flist[] = f.listFiles();
        for (int i = 0; i < flist.length; i++) {
            if (flist[i].isDirectory()) {
                size = size + getFileSize(flist[i]);
            } else {
                size = size + flist[i].length();
            }
        }
        return size;
    }

    /**
     * 递归删除文件/文件夹
     * @param file
     */
    public static void delFile(File file){
        if(file.isFile()){
            file.delete();
        }else if(file.isDirectory()){
            File file1s[] = file.listFiles();
            for(int i=0;i<file1s.length;i++){
                delFile(file1s[i]);
            }
            file.delete();
        }
    }

    /**
     * 从raw资源文件中获取
     *
     * @return
     */
    private String getAddress(Context context,int rawRes) {
        StringBuilder sb = new StringBuilder();
        try {
            InputStream inputStream = context.getResources().openRawResource(rawRes);
            byte[] buffer = new byte[1024];
            while (inputStream.read(buffer) != -1) {
                sb.append(new String(buffer, "UTF-8"));
            }
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    /**
     * 是否有足够的空间
     * @param size in B
     * @return
     */
    public boolean haveSpace(Context context, int size){
        //判断sdcard存储空间是否满足文件的存储
        File sdcard_filedir = Environment.getExternalStorageDirectory();//得到sdcard的目录作为一个文件对象
        long usableSpace = sdcard_filedir.getUsableSpace();//获取文件目录对象剩余空间
        long totalSpace = sdcard_filedir.getTotalSpace();

        //将一个long类型的文件大小格式化成用户可以看懂的M,G字符串
        String usableSpace_str = Formatter.formatFileSize(context, usableSpace);
        String totalSpace_str = Formatter.formatFileSize(context, totalSpace);

        if(usableSpace < size+20*1024*1024){//判断剩余空间是否小于size
            Toast.makeText(context, "sdcard剩余空间不足,无法满足下载;剩余空间为:"+usableSpace_str,Toast.LENGTH_SHORT).show();
            return false;
        }else{
            return true;
        }
    }

}

6.日志管理工具类:通过设置全局变量LOGLEVEL的值进行开启或关闭log,如-1开启,6关闭;

public class LogUtils {
    private static int LOGLEVEL = 6;
    private static int VERBOSE = 1;
    private static int DEBUG = 2;
    private static int INFO = 3;
    private static int WARN = 4;
    private static int ERROR = 5;

    public static void v(String tag, String msg){
        if(LOGLEVEL > VERBOSE) Log.v(tag,msg);
    }

    public static void d(String tag, String msg){
        if(LOGLEVEL > DEBUG) Log.d(tag, msg);
    }

    public static void i(String tag, String msg){
        if(LOGLEVEL > INFO) Log.i(tag, msg);
    }

    public static void w(String tag, String msg){
        if(LOGLEVEL > WARN) Log.w(tag, msg);
    }

    public static void e(String tag, String msg){
        if(LOGLEVEL > ERROR) Log.e(tag,msg);
    }

}

7.网络判断工具类:包括网络是否可用;获取当前网络类型;

public class NetWorkUtils {

    /**
     * 判断网路是否可用
     * @param context
     * @return
     */
    public static boolean isNetWorkAvailable(Context context){
        ConnectivityManager manager  = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //获取所有可用的网络连接信息
        NetworkInfo[] infos = manager.getAllNetworkInfo();
        if(null != infos){
            for(NetworkInfo info : infos){
                if(info.getState() == NetworkInfo.State.CONNECTED){
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 返回网络类型
     * @return
     */
    public static NetWorkState getNetworkState(Context context){
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI){
            return NetWorkState.WIFI;
        }else if(manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_MOBILE){
            return NetWorkState.MOBILE;
        }else {
            return NetWorkState.NONE;
        }
    }

    public enum NetWorkState {
        WIFI,MOBILE,NONE
    }
}

8.尺寸工具类:包括获取屏幕宽高,密度,dp、px互转,px、sp互转。

public class ScreenUtils {

    /**
     * 获取屏幕宽度
     * @param context
     * @return
     */
    public static int getScreenWidth(Context context){
        return context.getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 获取屏幕高度
     * @param context
     * @return
     */
    public static int getScreenHeight(Context context){
        return context.getResources().getDisplayMetrics().heightPixels;
    }

    /**
     * 获取屏幕密度
     * @param context
     * @return
     */
    public static float getScreenDensity(Context context){
        return context.getResources().getDisplayMetrics().density;
    }

    /**
     * dp转px
     * @param context
     * @param dpValue
     * @return
     */
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * px转dp
     * @param context
     * @param pxVal
     * @return
     */
    public static float px2dp(Context context, float pxVal) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (pxVal / scale);
    }

    /**
     * sp转px
     * @param context
     * @param spVal
     * @return
     */
    public static int sp2px(Context context, float spVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
                spVal, context.getResources().getDisplayMetrics());
    }

    /**
     * px转sp
     * @param context
     * @param pxVal
     * @return
     */
    public static float px2sp(Context context, float pxVal) {
        return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
    }

}

9.SharedPreferences存取操作类:传任意类型自动能存取数据。

public class SharedPrefUtils {
    public static final String SHAREFRE_FILENAME = "sharefile";

    /**
     * 保存数据到共享参数中
     * @param context
     * @param key  键
     * @param object  值
     */
    public static void setParams(Context context, String key, Object object){

        SharedPreferences sharedPreferences = context.getSharedPreferences(SHAREFRE_FILENAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        if(object instanceof String){
            editor.putString(key, (String) object);
        }else if(object instanceof Integer){
            editor.putInt(key, (Integer) object);
        }else if(object instanceof Boolean){
            editor.putBoolean(key, (Boolean) object);
        }else if(object instanceof Float){
            editor.putFloat(key, (Float) object);
        }else if(object instanceof Long){
            editor.putLong(key, (Long) object);
        }

        editor.commit();
    }

    /**
     *  获取共享参数,根据默认数据类型获取相对应key的值
     * @param context
     * @param key  键
     * @param defaultObject  默认值
     * @return
     */
    public static Object getParams(Context context, String key, Object defaultObject){

        SharedPreferences sharedPreferences = context.getSharedPreferences(SHAREFRE_FILENAME, Context.MODE_PRIVATE);

        if(defaultObject instanceof String){
            return sharedPreferences.getString(key, (String) defaultObject);
        }else if(defaultObject instanceof Integer){
            return sharedPreferences.getInt(key, (Integer) defaultObject);
        }else if(defaultObject instanceof Boolean){
            return sharedPreferences.getBoolean(key, (Boolean) defaultObject);
        }else if(defaultObject instanceof Float){
            return sharedPreferences.getFloat(key, (Float) defaultObject);
        }else if(defaultObject instanceof Long){
            return sharedPreferences.getLong(key, (Long) defaultObject);
        }
        return null;
    }

}

10.字符串操作工具类:获取时间;时间戳转日期;保留指定位小数点;字符串判空等。

public class StrUtils {

    private static String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";
    private static String phonePatter = "^1\\d{10}$";

    /** 获得当前时间 */
    public static CharSequence currentTime(CharSequence inFormat) {
        return DateFormat.format(inFormat, System.currentTimeMillis());
    }

    /**
     * 时间戳转 yyyy年MM月dd日 HH:mm
     * @param longTime
     * @return
     */
    public static String getDateTime(String longTime){
        long time = Long.valueOf(longTime)*1000;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
        return  sdf.format(new Date(time));
    }

    /**
     * 时间戳转 yyy年MM月dd日 HH:mm:ss
     * @param longTime
     * @return
     */
    public static String getDateSec(String longTime){
        long time = Long.valueOf(longTime)*1000;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        return  sdf.format(new Date(time));
    }

    /**
     * 时间戳转 MM月dd日 HH:mm
     * @param longTime
     * @return
     */
    public static String getDateMinite(String longTime){
        long time = Long.valueOf(longTime)*1000;
        SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 HH:mm");
        return  sdf.format(new Date(time));
    }

    /**
     * 时间戳转 yyyy-MM-dd HH:mm
     * @param longTime
     * @return
     */
    public static String getTime(String longTime){
        long time = Long.valueOf(longTime)*1000;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return  sdf.format(new Date(time));
    }

    /**
     * 时间戳转 yyyy-MM-dd
     * @param longTime
     * @return
     */
    public static String getdate(String longTime){
        long time = Long.valueOf(longTime)*1000;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return  sdf.format(new Date(time));
    }

    /**
     * 日期转时间戳
     * @return
     */
    public static String getTimeStamp(String dateTime, String format){
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
            return String.valueOf(simpleDateFormat.parse(dateTime).getTime()/1000);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 从短信中截取验证码
     * @param patternContent
     * @return
     */
    public static String patternCode(String patternContent) {
        if (TextUtils.isEmpty(patternContent)) {
            return null;
        }
        Pattern p = Pattern.compile(patternCoder);
        Matcher matcher = p.matcher(patternContent);
        if (matcher.find()) {
            return matcher.group();
        }
        return null;
    }

    /**
     * 检测手机号码
     * @param patternContent
     * @return
     */
    public static boolean checkPhone(String patternContent){
        Pattern pattern = Pattern.compile(phonePatter);
        Matcher matcher =  pattern.matcher(patternContent);
        return matcher.matches();
    }

    /**
     * 保留指定小数点位数,format传 "0.0" "0.00"形式分别保存一位,两位小数
     * @param num
     * @param format
     * @return
     */
    public static String doubleRound(double num, String format){
        DecimalFormat df = new DecimalFormat(format);
        return df.format(num);
    }

    /**
     * 判断单个字符串是否为空
     * @param str
     * @return
     */
    public static boolean isStr(String str){
        if(null != str && str.length() != 0) return true;
        return false;
    }

    /**
     * 判断多个字符串是否为空
     * @param str
     * @return
     */
    public static boolean isArrStr(String... str){
        if(null == str) return false;
        for(String s : str){
            if(!isStr(s)) return false;
        }
        return true;
    }
}

哇塞,你看完了,做做眼保健操放松放松眼睛吧。好啦,本期节目就到此为止了,下期节目再见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容