安卓开发常用的工具类
来源:互联网 发布:匿名举报网络诈骗 编辑:程序博客网 时间:2024/06/05 14:10
最近一直在忙项目,今天终于抽出时间来总结一下。下面吧自己觉得挺常用的一些工具类贴出来总结一下、分享一下。其中有在网上找的也有自己写的也有自己改的。
1.登录注册时验证手机号是否合法
/**
* Created by liuzongxin on 2015/11/14.
*/
public class CommonUtils {
private static Gson mGson;
private static final String GSON_FORMAT = “yyyy-MM-dd HH:mm:ss”;
public static SimpleDateFormat formatDate = new SimpleDateFormat(“yyyy-MM-dd”, Locale.getDefault());
public static SimpleDateFormat formatDay = new SimpleDateFormat(“d”, Locale.getDefault());
public static SimpleDateFormat formatMonthDay = new SimpleDateFormat(“M-d”, Locale.getDefault());
public static SimpleDateFormat formatDateTime = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”, Locale.getDefault());
/** * 中国移动拥有号码段为:134 135 136 137 138 139 147 150 151 152 157 158 159 178 182 183 184 187 188 * 19个号段 中国联通拥有号码段为:130 131 132 145 155 156 175 176 185 186;10个号段 * 中国电信拥有号码段为:133 153 177 180 181 189;6个号码段 * 虚拟运营商:170 */private static String regMobileStr = "^1(([3][456789])|([4][7])|([5][012789])|([7][8])|([8][23478]))[0-9]{8}$";private static String regUnicomStr = "^1(([3][012])|([4][5])|([5][56])|([7][5])|([8][56]))[0-9]{8}$";private static String regTelecomStr = "^1(([3][3])|([5][3])|([7][07])|([8][019]))[0-9]{8}$";private CommonUtils() {}/** * return if str is empty * * @param str * @return */public static boolean isEmpty(String str) { if (str == null || str.length() == 0 || str.equalsIgnoreCase("null") || str.isEmpty() || str.equals("")) { return true; } else { return false; }}/** * 验证手机号是否合法 * * @param mobile * @return */public static boolean isMobileLawful(String mobile) { if (!isEmpty(mobile)) { /** */ /** 第一步判断中国移动 */ if (mobile.matches(CommonUtils.regMobileStr)) { return true; } /** */ /** 第二步判断中国联通 */ if (mobile.matches(CommonUtils.regUnicomStr)) { return true; } /** */ /** 第三步判断中国电信 */ if (mobile.matches(CommonUtils.regTelecomStr)) { return true; } } return false;}/** * 验证json合法性 * * @param jsonContent * @return */public static boolean isJsonFormat(String jsonContent) { try { new JsonParser().parse(jsonContent); return true; } catch (JsonParseException e) { return false; }}/** * 格式化日期 * * @param date * @return 年月日 */public static String formatDate(Date date) { return formatDate.format(date);}/** * 格式化日期 * * @param date * @return 年月日 时分秒 */public static String formatDateTime(Date date) { return formatDateTime.format(date);}/** * 将时间戳解析成日期 * * @param timeInMillis * @return 年月日 */public static String parseDate(long timeInMillis) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timeInMillis); Date date = calendar.getTime(); return formatDate(date);}/** * 将时间戳解析成日期 * * @param timeInMillis * @return 年月日 时分秒 */public static String parseDateTime(long timeInMillis) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timeInMillis); Date date = calendar.getTime(); return formatDateTime(date);}/** * 解析日期 * * @param date * @return */public static Date parseDate(String date) { Date mDate = null; try { mDate = formatDate.parse(date); } catch (ParseException e) { e.printStackTrace(); } return mDate;}/** * 解析日期 * * @param datetime * @return */public static Date parseDateTime(String datetime) { Date mDate = null; try { mDate = formatDateTime.parse(datetime); } catch (ParseException e) { e.printStackTrace(); } return mDate;}/** * 对指定字符串进行md5加密 * * @param s * @return 加密后的数据 */public static String EncryptMD5(String s) { char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.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); } catch (Exception e) { e.printStackTrace(); return null; }}/** * 判断email格式是否正确 * * @param email * @return */public static boolean isEmail(String email) { String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; Pattern p = Pattern.compile(str); Matcher m = p.matcher(email); return m.matches();}/** * 根据系统语言判断是否为中国 * * @return */public static boolean isZh() { Locale locale = BaseApp.getInstance().getResources().getConfiguration().locale; String language = locale.getLanguage(); if (language.startsWith("zh")) { return true; } else { return false; }}/** * Try to return the absolute file path from the given Uri * * @param context * @param uri * @return the file path or null */public static String getRealFilePath(final Context context, final Uri uri) { if (null == uri) return null; final String scheme = uri.getScheme(); String data = null; if (scheme == null) data = uri.getPath(); else if (ContentResolver.SCHEME_FILE.equals(scheme)) { data = uri.getPath(); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null); if (null != cursor) { if (cursor.moveToFirst()) { int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if (index > -1) { data = cursor.getString(index); } } cursor.close(); } } return data;}/** * 获取gson对象 * * @return */public static Gson getGson() { if (mGson == null) { mGson = new GsonBuilder().setDateFormat(GSON_FORMAT).create(); // 创建gson对象,并设置日期格式 } return mGson;}/** * 调用震动器 * * @param context 调用该方法的Context * @param milliseconds 震动的时长,单位是毫秒 */public static void vibrate(final Context context, long milliseconds) { Vibrator vib = (Vibrator) context.getSystemService(Service.VIBRATOR_SERVICE); vib.vibrate(milliseconds);}/** * 调用震动器 * * @param context 调用该方法的Context * @param pattern 自定义震动模式 。数组中数字的含义依次是[静止时长,震动时长,静止时长,震动时长。。。]时长的单位是毫秒 * @param isRepeat 是否反复震动,如果是true,反复震动,如果是false,只震动一次 */public static void vibrate(final Context context, long[] pattern, boolean isRepeat) { Vibrator vib = (Vibrator) context.getSystemService(Service.VIBRATOR_SERVICE); vib.vibrate(pattern, isRepeat ? 1 : -1);}/** * 播放音乐 * * @param context */public static void playMusic(Context context) { MediaPlayer mp = MediaPlayer.create(context, R.raw.beep); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); } }); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mediaPlayer.release(); } });}/** * 获取联系人电话 * * @param cursor * @return */private String getContactPhone(Context context, Cursor cursor) { int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); int phoneNum = cursor.getInt(phoneColumn); String phoneResult = ""; //System.out.print(phoneNum); if (phoneNum > 0) { // 获得联系人的ID号 int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID); String contactId = cursor.getString(idColumn); // 获得联系人的电话号码的cursor; Cursor phones = context.getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); //int phoneCount = phones.getCount(); //allPhoneNum = new ArrayList<String>(phoneCount); if (phones.moveToFirst()) { // 遍历所有的电话号码 for (; !phones.isAfterLast(); phones.moveToNext()) { int index = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); int typeindex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); int phone_type = phones.getInt(typeindex); String phoneNumber = phones.getString(index); switch (phone_type) { case 2: phoneResult = phoneNumber; break; } //allPhoneNum.add(phoneNumber); } if (!phones.isClosed()) { phones.close(); } } } return phoneResult;}/** * 判断email格式是否正确 * * @param s * @return */public static boolean digital(CharSequence s) { String str = "^[0-9]*$"; Pattern p = Pattern.compile(str); Matcher m = p.matcher(s); return m.matches();}
}
2.对于安卓用户,单位换算经常遇到。挺鸡肋的,还是总结一下吧。
public class DensityUtils {
private static final float DOT_FIVE = 0.5f;/** * dip to px * * @param context * @param dip * @return */public static int dip2px(Context context, float dip) { float density = getDensity(context); return (int) (dip * density + DensityUtils.DOT_FIVE);}/** * px to dip * * @param context * @param px * @return */public static int px2dip(Context context, float px) { float density = getDensity(context); return (int) (px / density + DOT_FIVE);}private static DisplayMetrics sDisplayMetrics;/** * get screen width * * @param context * @return */public static int getDisplayWidth(Context context) { initDisplayMetrics(context); return sDisplayMetrics.widthPixels;}/** * get screen height * * @param context * @return */public static int getDisplayHeight(Context context) { initDisplayMetrics(context); return sDisplayMetrics.heightPixels;}/** * get screen density * * @param context * @return */public static float getDensity(Context context) { initDisplayMetrics(context); return sDisplayMetrics.density;}/** * get screen density dpi * * @param context * @return */public static int getDensityDpi(Context context) { initDisplayMetrics(context); return sDisplayMetrics.densityDpi;}/** * init display metrics * * @param context */private static synchronized void initDisplayMetrics(Context context) { sDisplayMetrics = context.getResources().getDisplayMetrics();}/** * is landscape * * @param context * @return */public static boolean isLandscape(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;}/** * is portrait * * @param context * @return */public static boolean isPortrait(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;}
}
3.圆头像这个遇见的太多了,必须分享下,直接使用(最好用android:src属性)就行什么都不用配置。
public class CircleImageView extends ImageView {
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;private static final int COLORDRAWABLE_DIMENSION = 2;private static final int DEFAULT_BORDER_WIDTH = 0;private static final int DEFAULT_BORDER_COLOR = Color.BLACK;private final RectF mDrawableRect = new RectF();private final RectF mBorderRect = new RectF();private final Matrix mShaderMatrix = new Matrix();private final Paint mBitmapPaint = new Paint();private final Paint mBorderPaint = new Paint();private int mBorderColor = DEFAULT_BORDER_COLOR;private int mBorderWidth = DEFAULT_BORDER_WIDTH;private Bitmap mBitmap;private BitmapShader mBitmapShader;private int mBitmapWidth;private int mBitmapHeight;private float mDrawableRadius;private float mBorderRadius;private ColorFilter mColorFilter;private boolean mReady;private boolean mSetupPending;public CircleImageView(Context context) { super(context); init();}public CircleImageView(Context context, AttributeSet attrs) { this(context, attrs, 0);}public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0); mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH); mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR); a.recycle(); init();}private void init() { super.setScaleType(SCALE_TYPE); mReady = true; if (mSetupPending) { setup(); mSetupPending = false; }}@Overridepublic ScaleType getScaleType() { return SCALE_TYPE;}@Overridepublic void setScaleType(ScaleType scaleType) { if (scaleType != SCALE_TYPE) { throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); }}@Overridepublic void setAdjustViewBounds(boolean adjustViewBounds) { if (adjustViewBounds) { throw new IllegalArgumentException("adjustViewBounds not supported."); }}@Overrideprotected void onDraw(Canvas canvas) { if (getDrawable() == null) { return; } canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint); if (mBorderWidth != 0) { canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint); }}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); setup();}public int getBorderColor() { return mBorderColor;}public void setBorderColor(int borderColor) { if (borderColor == mBorderColor) { return; } mBorderColor = borderColor; mBorderPaint.setColor(mBorderColor); invalidate();}public int getBorderWidth() { return mBorderWidth;}public void setBorderWidth(int borderWidth) { if (borderWidth == mBorderWidth) { return; } mBorderWidth = borderWidth; setup();}@Overridepublic void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); mBitmap = bm; setup();}@Overridepublic void setImageDrawable(Drawable drawable) { super.setImageDrawable(drawable); mBitmap = getBitmapFromDrawable(drawable); setup();}@Overridepublic void setImageResource(int resId) { super.setImageResource(resId); mBitmap = getBitmapFromDrawable(getDrawable()); setup();}@Overridepublic void setImageURI(Uri uri) { super.setImageURI(uri); mBitmap = getBitmapFromDrawable(getDrawable()); setup();}@Overridepublic void setColorFilter(ColorFilter cf) { if (cf == mColorFilter) { return; } mColorFilter = cf; mBitmapPaint.setColorFilter(mColorFilter); invalidate();}private Bitmap getBitmapFromDrawable(Drawable drawable) { if (drawable == null) { return null; } if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } try { Bitmap bitmap; if (drawable instanceof ColorDrawable) { bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); } else { bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } catch (OutOfMemoryError e) { return null; }}private void setup() { if (!mReady) { mSetupPending = true; return; } if (mBitmap == null) { return; } mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapPaint.setAntiAlias(true); mBitmapPaint.setShader(mBitmapShader); mBorderPaint.setStyle(Paint.Style.STROKE); mBorderPaint.setAntiAlias(true); mBorderPaint.setColor(mBorderColor); mBorderPaint.setStrokeWidth(mBorderWidth); mBitmapHeight = mBitmap.getHeight(); mBitmapWidth = mBitmap.getWidth(); mBorderRect.set(0, 0, getWidth(), getHeight()); mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2); mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth); mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2); updateShaderMatrix(); invalidate();}private void updateShaderMatrix() { float scale; float dx = 0; float dy = 0; mShaderMatrix.set(null); if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { scale = mDrawableRect.height() / (float) mBitmapHeight; dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f; } else { scale = mDrawableRect.width() / (float) mBitmapWidth; dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f; } mShaderMatrix.setScale(scale, scale); mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth); mBitmapShader.setLocalMatrix(mShaderMatrix);}
}
别忘了在attrs中添加自定义属性:
<attr name="border_width" format="dimension" /> <attr name="border_color" format="color" /></declare-styleable>
4.这个大家都知道,日期转换。但是“23十月2015”这种格式的是不是很少见。
/*****************************************************************************************
* function: 日期工具类:将util.Date日期转换成大写日期格式
* @project web
* @package base.datetime
* @fileName DateUtils.java
*/
import java.util.Calendar;
import java.util.Date;
public class DateUtils {
// 日期转化为大小写
public static String dataToUpper(Date date) {
Calendar ca = Calendar.getInstance();
ca.setTime(date);
int year = ca.get(Calendar.YEAR);
int month = ca.get(Calendar.MONTH) + 1;
int day = ca.get(Calendar.DAY_OF_MONTH);
return day+” “+monthToUppder(month) + “月” +” “+year;
}
/*** * <b>function:</b> 将数字转化为大写 * @param num 数字 * @return 转换后的大写数字 */public static String numToUpper(int num) { // String u[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; String u[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; //String u[] = {"○", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; char[] str = String.valueOf(num).toCharArray(); String rstr = ""; for (int i = 0; i < str.length; i++) { rstr = rstr + u[Integer.parseInt(str[i] + "")]; } return rstr;}/*** * <b>function:</b> 月转化为大写 * @param month 月份 * @return 返回转换后大写月份 */public static String monthToUppder(int month) { if (month < 10) { return numToUpper(month); } else if (month == 10) { return "十"; } else { return "十" + numToUpper(month - 10); }}/*** * <b>function:</b> 日转化为大写 * @param day 日期 * @return 转换大写的日期格式 */public static String dayToUppder(int day) { if (day < 20) { return monthToUppder(day); } else { char[] str = String.valueOf(day).toCharArray(); if (str[1] == '0') { return numToUpper(Integer.parseInt(str[0] + "")) + "十"; } else { return numToUpper(Integer.parseInt(str[0] + "")) + "十" + numToUpper(Integer.parseInt(str[1] + "")); } }}public static void main(String[] args) { System.out.println(DateUtils.dataToUpper(new Date()));}
}
5.保存图片到本地(之前的博客也写过。不过据说这种方法不能适配所有安卓机型,但是目前为止我还没有遇见不适配的所以一直在用)
public class SaveImage {
/**
* 保存文件
* @param bm
* @param fileName
* @throws IOException
*/
public static void saveFile(Bitmap bm, String fileName) throws IOException {
String path = getSDPath() +”/fashion/”;
File dirFile = new File(path);
if(!dirFile.exists()){
dirFile.mkdir();
}
File myCaptureFile = new File(path + fileName);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 60, bos);
bos.flush();
bos.close();
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(dirFile);
intent.setData(uri);
APP.getInstance().sendBroadcast(intent);
}
public static String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();//获取跟目录
}
return sdDir.toString();
}
/**
* return a bitmap from service
* @param url
* @return bitmap type
*/
public final static Bitmap returnBitMap(String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try { myFileUrl = new URL(url); HttpURLConnection conn; conn = (HttpURLConnection) myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap;}
}
- 安卓开发常用的工具类
- 安卓实用常用的开发工具
- 安卓开发中常用的十个工具类
- 安卓开发中常用的10个工具类
- 安卓开发常用到的工具类
- 安卓常用的工具类分享~~~~
- Log安卓开发中常用的优秀日志工具
- Log安卓开发中常用的优秀日志工具
- 安卓开发-工具类的使用
- 安卓工具类------>常用单位转换的辅助类
- 安卓开发常用的工具集合(第三方SDK等)
- 安卓开发工具
- [安卓开发工具]
- 安卓开发不得不收集的工具类
- 安卓开发操作状态栏的工具类
- 安卓开发常用的颜色
- 安卓开发-常用的设置
- 安卓系统开发常用的框架
- Java设计模式_结构型_享元模式_实现单元的共享
- Appium-bootstrap的调试方法
- Big Omicron and Big Omega and Big Theta
- 如何给VSFTP增加用户,只能访问指定目录
- 怎样修复MindMapper里面中断的超链接
- 安卓开发常用的工具类
- [C++]《Windows核心编程》读书笔记
- 让FlowLayout的布局的排列方向竖着来
- android实现大文件下载解析
- require md 模板
- jqGrid增删改查显示——查找
- Centos 7 Nginx 服务
- SpringMvc
- centos 6.5 64bit安装 oracle 11g 准备工作