Android 开发中常用的10种工具类 借鉴篇

先贴一下引用地址:https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454031208&idx=1&sn=f7846d98361cd3311db33ae0d17f0bca&chksm=872b9ed1b05c17c7580d5c60c8dc5771ed0cb7e9179c35f0c1580edbee8ee42c1034ccbd8b0d&mpshare=1&scene=23&srcid=1008Dk5ESIKF5nRj3BNx33o8#rd

Android tips
配置全局搜索的快捷键 在keymap中 搜索 find in path ,找到相应修改。(我这ctrl+shift+H不起作用,所以修改一下.)

并非商用,这实在是太给力啦。赶紧收藏吧。我这里稍微整理(几乎原封不动的搬了一下),乐于分享。如有冒犯之处,请留言。

1.安装应用APK

// 安装应用APK
private void installApk(String apkFilePath) {
File apkfile = new File(apkFilePath);
if (!apkfile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
startActivity(i);
}
}

2.MD5算法

public final static String MD5(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;
}
}
3.判断现在是否有网络

private boolean NetWorkStatus() {
ConnectivityManager cwjManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cwjManager.getActiveNetworkInfo();
boolean netSataus = true;
if (cwjManager.getActiveNetworkInfo() != null) {
netSataus = cwjManager.getActiveNetworkInfo().isAvailable();
Toast.makeText(this, "网络已经打开", Toast.LENGTH_LONG).show();
}
else {
Builder b = new AlertDialog.Builder(this).setTitle("没有可用的网络")
.setMessage("是否对网络进行设置?");
b.setPositiveButton("是", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton) {
Intent mIntent = new Intent("/");
ComponentName comp = new ComponentName( "com.android.settings", "com.android.settings.WirelessSettings");
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW");
startActivityForResult(mIntent,0);
}
}).setNeutralButton("否", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
}).show();
}
return netSataus;
}

4.获取设备屏幕的宽度高度密度

public class DisplayUtil {
/**
* 得到设备屏幕的宽度
/
public static int getScreenWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
} /
*
* 得到设备屏幕的高度
/
public static int getScreenHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
} /
*
* 得到设备的密度
*/
public static float getScreenDensity(Context context) {
return context.getResources().getDisplayMetrics().density;
}
}

5.dp、sp 转换为 px 的工具类

public class DisplayUtil {
/**
* 将px值转换为dip或dp值,保证尺寸大小不变
/
public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f);
} /
*
* 将dip或dp值转换为px值,保证尺寸大小不变
*
* @param dipValue
* @param scale
* (DisplayMetrics类中属性density)
* @return
/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
} /
*
* 将px值转换为sp值,保证文字大小不变
*
* @param pxValue
* @param fontScale
* (DisplayMetrics类中属性scaledDensity)
* @return
/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
} /
*
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue
* @param fontScale
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}

6.drawable转bitmap的工具类

/**

  • drawable转bitmap
  • @param drawable
  • @return
    */private Bitmap drawableToBitamp(Drawable drawable) {
    if (null == drawable) {
    return null;
    }if (drawable instanceof BitmapDrawable) {
    BitmapDrawable bd = (BitmapDrawable) drawable;
    return bd.getBitmap();
    }
    int w = drawable.getIntrinsicWidth();
    int h = drawable.getIntrinsicHeight();
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, w, h);
    drawable.draw(canvas);
    return bitmap;
    }

7.文章发布模仿朋友圈时间显示

public static String ChangeTime(Date time) {
String ftime = "";
Calendar cal = Calendar.getInstance(); // 判断是否是同一天
String curDate = dateFormater2.get().format(cal.getTime());
String paramDate = dateFormater2.get().format(time);
if (curDate.equals(paramDate)) {
int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);
if (hour == 0)
ftime = Math.max(
(cal.getTimeInMillis() - time.getTime()) / 60000, 1)
+ "分钟前";
else
ftime = hour + "小时前";
return ftime;
} long lt = time.getTime() / 86400000;
long ct = cal.getTimeInMillis() / 86400000;
int days = (int) (ct - lt);
if (days == 0) {
int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);
if (hour == 0)
ftime = Math.max( (cal.getTimeInMillis() - time.getTime()) / 60000, 1)
+ "分钟前";
else
ftime = hour + "小时前";
} else if (days == 1) {
ftime = "昨天";
} else if (days == 2) {
ftime = "前天 ";
} else if (days > 2 && days < 31) {
ftime = days + "天前";
} else if (days >= 31 && days <= 2 * 31) {
ftime = "一个月前";
} else if (days > 2 * 31 && days <= 3 * 31) {
ftime = "2个月前";
} else if (days > 3 * 31 && days <= 4 * 31) {
ftime = "3个月前";
} else {
ftime = dateFormater2.get().format(time);
} return ftime;
} public static String friendly_time(String sdate) {
Date time = null;
if (TimeZoneUtil.isInEasternEightZones())
time = toDate(sdate); else
time = TimeZoneUtil.transformTime(toDate(sdate),
TimeZone.getTimeZone("GMT+08"), TimeZone.getDefault());
if (time == null) {
return "Unknown";
}
String ftime = "";
Calendar cal = Calendar.getInstance(); // 判断是否是同一天
String curDate = dateFormater2.get().format(cal.getTime());
String paramDate = dateFormater2.get().format(time);
if (curDate.equals(paramDate)) {
int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);
if (hour == 0)
ftime = Math.max(
(cal.getTimeInMillis() - time.getTime()) / 60000, 1)
+ "分钟前";
else
ftime = hour + "小时前";
return ftime;
} long lt = time.getTime() / 86400000;
long ct = cal.getTimeInMillis() / 86400000;
int days = (int) (ct - lt);
if (days == 0) {
int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);
if (hour == 0)
ftime = Math.max(
(cal.getTimeInMillis() - time.getTime()) / 60000, 1)
+ "分钟前";
else
ftime = hour + "小时前";
} else if (days == 1) {
ftime = "昨天";
} else if (days == 2) {
ftime = "前天 ";
} else if (days > 2 && days < 31) {
ftime = days + "天前";
} else if (days >= 31 && days <= 2 * 31) {
ftime = "一个月前";
} else if (days > 2 * 31 && days <= 3 * 31) {
ftime = "2个月前";
} else if (days > 3 * 31 && days <= 4 * 31) {
ftime = "3个月前";
} else {
ftime = dateFormater2.get().format(time);
} return ftime;
}

8.时间格式转换工具类

public static String ConverToString(Date date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
return df.format(date);
}
public static String ConverToString2(Date date){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return df.format(date);
}
public static String ConverToString3(Date date){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(date);
}

9.验证码倒计时工具类

public class TimeCount extends CountDownTimer {
private Button button; /**
* 到计时
* @param millisInFuture 到计时多久,毫秒
* @param countDownInterval 周期
* @param button 按钮
*/
public TimeCount(long millisInFuture, long countDownInterval,Button button) {
super(millisInFuture, countDownInterval);
this.button =button;
}
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {// 计时完毕
button.setText("获取验证码");
button.setClickable(true);
button.setBackground(MyApplication.getContext().getResources().getDrawable(R.drawable.radius14));
}
@Override
public void onTick(long millisUntilFinished) {// 计时过程
button.setClickable(false);//防止重复点击
button.setText(millisUntilFinished / 1000 + "s后重试");
button.setBackground(MyApplication.getContext().getResources().getDrawable(R.drawable.radius_gray));
}
}

10.屏幕截图工具类

public class ScreenShot {
public static void shoot(Activity a, File filePath) {
if (filePath == null) {
return;
}
if (!filePath.getParentFile().exists()) {
filePath.getParentFile().mkdirs();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filePath);
if (null != fos) {
takeScreenShot(a).compress(Bitmap.CompressFormat.PNG, 100, fos);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} private static Bitmap takeScreenShot(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
int width = activity.getWindowManager().getDefaultDisplay().getWidth();
int height = activity.getWindowManager().getDefaultDisplay()
.getHeight(); //去掉标题栏
Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
height - statusBarHeight);
view.destroyDrawingCache(); return b;
}

}

说好的10中工具类的还有一个google,怎么使用log.

11.先上源码

package com.android.music;
import android.os.Debug;
public class MusicLog {
private static final boolean DEBUG = true;
public static void v(String tag, String msg) {
if(DEBUG) {
android.util.Log.v(tag, msg);
}
}
public static void v(String tag, String msg, Throwable tr) {
if(DEBUG) {
android.util.Log.v(tag, msg, tr);
}
}
public static void d(String tag, String msg) {
if(DEBUG) {
android.util.Log.d(tag, msg);
}
}
public static void d(String tag, String msg, Throwable tr) {
if(DEBUG) {
android.util.Log.d(tag, msg, tr);
}
}
public static void i(String tag, String msg) {
if(DEBUG) {
android.util.Log.i(tag, msg);
}
}
public static void i(String tag, String msg, Throwable tr) {
if(DEBUG) {
android.util.Log.i(tag, msg, tr);
}
}
public static void w(String tag, String msg) {
if(DEBUG) {
android.util.Log.w(tag, msg);
}
}
public static void w(String tag, String msg, Throwable tr) {
if(DEBUG) {
android.util.Log.w(tag, msg, tr);
}
}
public static void w(String tag, Throwable tr) {
if(DEBUG) {
android.util.Log.w(tag, tr);
}
}
public static void e(String tag, String msg) {
if(DEBUG) {
android.util.Log.e(tag, msg);
}
}
public static void e(String tag, String msg, Throwable tr) {
if(DEBUG) {
android.util.Log.e(tag, msg, tr);
}
}

}

怎么使用?
private static final String LOGTAG = "LyricListView";
MusicLog.d(LOGTAG, "mAdapter.getCount = " + mAdapter.getCount());
MusicLog.e(LOGTAG, "SET LYRIC ERROR:" + e.getMessage());

分析这样写的好处.

上面代码,我们通过 private static final boolean DEBUG = true ; 我们可以统一的控制 log 的输出和关闭。如果采用这种方式打印日志信息,我们就可以在 debug 的版本中输出 log,而在 release 版本中关闭 log 的输出 。这样防止自己的软件信息被泄露出去 。而且,如果采用这种方式,是不是会觉得代码的打印日志信息的格式更简单更美观更统一呢。现在得到了个打印 Log 新技能,还不赶紧用到自己项目上去吗?

你可能感兴趣的:(Android 开发中常用的10种工具类 借鉴篇)