android常用类封装,Android 常见工具类封装

这个博客涵盖了多个Java编程主题,包括MD5工具类的实现,线程睡眠的控制,网络连接状态的检查,异常处理机制特别是针对UncaughtException的处理,以及图片API的使用,提供了图片尺寸调整的方法。同时,还封装了一个通用的UI提示方法,用于显示Toast通知。
摘要由CSDN通过智能技术生成

1,MD5工具类:

public class MD5Util {

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) {

return null;

}

}

public static void main(String[] args) {

System.out.print(MD5Util.MD5("password"));

}

}

2,线程睡眠

public class CSleep {

public static final long DEFAULT_SLEEP_TIME = 500;

private boolean isRuning = false;

public boolean isRuning() {

return isRuning;

}

public void runWithTime(final long defaultSleepTime) {

isRuning = true;

new Thread() {

@Override

public void run() {

try {

sleep(defaultSleepTime, 0);

} catch (InterruptedException e) {

e.printStackTrace();

}

isRuning = false;

super.run();

}

}.start();

}

}

3,检查网络是否连通

/**

* 检查网络是否连通

*

* @return boolean

* @since V1.0

*/

public boolean isNetworkAvailable(Context context) {

// 创建并初始化连接对象

ConnectivityManager connMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

// 判断初始化是否成功并作出相应处理

if (connMan != null) {

// 调用getActiveNetworkInfo方法创建对象,如果不为空则表明网络连通,否则没连通

NetworkInfo info = connMan.getActiveNetworkInfo();

if (info != null) {

return info.isAvailable();

}

}

return false;

}

4,异常类捕捉

/**

* UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告. 需要在Application中注册,为了要在程序启动器就监控整个程序。

*/

public class CrashHandler implements UncaughtExceptionHandler {

/** TAG */

public static final String TAG = "CrashHandler";

/** 系统默认的UncaughtException处理类 */

private Thread.UncaughtExceptionHandler mDefaultHandler;

/** CrashHandler实例 */

private static CrashHandler mCrashHandler;

/** 程序的Context对象 */

private Context mContext;

/** 用来存储设备信息和异常信息 */

private Map infos = new HashMap();

/** 用于格式化日期,作为日志文件名的一部分 */

private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

/**

* 私有构造函数

*/

private CrashHandler() {

}

/**

* 获取CrashHandler实例 ,单例模式

*

* @return

* @since V1.0

*/

public static CrashHandler getInstance() {

if (mCrashHandler == null)

mCrashHandler = new CrashHandler();

return mCrashHandler;

}

/**

* 初始化

*

* @param context

* @since V1.0

*/

public void init(Context context) {

mContext = context;

// 获取系统默认的UncaughtException处理器

mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

// 设置该CrashHandler为程序的默认处理器

Thread.setDefaultUncaughtExceptionHandler(this);

}

/**

* 当UncaughtException发生时会转入该函数来处理

*/

@Override

public void uncaughtException(Thread thread, Throwable ex) {

if (!handleException(ex) && mDefaultHandler != null) {

// 如果用户没有处理则让系统默认的异常处理器来处理

mDefaultHandler.uncaughtException(thread, ex);

} else {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

CLog.e(TAG, "uncaughtException() InterruptedException:" + e);

}

// 退出程序

android.os.Process.killProcess(android.os.Process.myPid());

System.exit(1);

}

}

/**

* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.

*

* @param ex

* @return true:如果处理了该异常信息;否则返回false.

* @since V1.0

*/

private boolean handleException(Throwable ex) {

if (ex == null) {

return false;

}

// 收集设备参数信息

collectDeviceInfo(mContext);

// 使用Toast来显示异常信息

new Thread() {

@Override

public void run() {

Looper.prepare();

Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_SHORT).show();

Looper.loop();

}

}.start();

// 保存日志文件

saveCatchInfo2File(ex);

return true;

}

/**

* 收集设备参数信息

*

* @param ctx

* @since V1.0

*/

public void collectDeviceInfo(Context ctx) {

try {

PackageManager pm = ctx.getPackageManager();

PackageInfo pi = pm.getPackageInfo(ctx.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 (NameNotFoundException e) {

CLog.e(TAG, "collectDeviceInfo() an error occured when collect package info NameNotFoundException:", e);

}

Field[] fields = Build.class.getDeclaredFields();

for (Field field : fields) {

try {

field.setAccessible(true);

infos.put(field.getName(), field.get(null).toString());

CLog.d(TAG, field.getName() + " : " + field.get(null));

} catch (Exception e) {

CLog.e(TAG, "collectDeviceInfo() an error occured when collect crash info Exception:", e);

}

}

}

/**

* 保存错误信息到文件中

*

* @param ex

* @return 返回文件名称,便于将文件传送到服务器

*/

private String saveCatchInfo2File(Throwable ex) {

StringBuffer sb = new StringBuffer();

for (Map.Entry entry : infos.entrySet()) {

String key = entry.getKey();

String value = entry.getValue();

sb.append(key + "=" + value + "\n");

}

Writer writer = new StringWriter();

PrintWriter printWriter = new PrintWriter(writer);

ex.printStackTrace(printWriter);

Throwable cause = ex.getCause();

while (cause != null) {

cause.printStackTrace(printWriter);

cause = cause.getCause();

}

printWriter.close();

String result = writer.toString();

sb.append(result);

try {

long timestamp = System.currentTimeMillis();

String time = formatter.format(new Date());

String fileName = "crash-" + time + "-" + timestamp + ".log";

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

String path = FilePathUtil.getiVMSDirPath() + "/crash/";

File dir = new File(path);

if (!dir.exists()) {

dir.mkdirs();

}

FileOutputStream fos = new FileOutputStream(path + fileName);

fos.write(sb.toString().getBytes());

// 发送给开发人员

sendCrashLog2PM(path + fileName);

fos.close();

}

return fileName;

} catch (Exception e) {

CLog.e(TAG, "saveCatchInfo2File() an error occured while writing file... Exception:", e);

}

return null;

}

/**

* 将捕获的导致崩溃的错误信息发送给开发人员 目前只将log日志保存在sdcard 和输出到LogCat中,并未发送给后台。

*

* @param fileName

* @since V1.0

*/

private void sendCrashLog2PM(String fileName) {

if (!new File(fileName).exists()) {

CLog.e(TAG, "sendCrashLog2PM() 日志文件不存在");

return;

}

FileInputStream fis = null;

BufferedReader reader = null;

String s = null;

try {

fis = new FileInputStream(fileName);

reader = new BufferedReader(new InputStreamReader(fis, "GBK"));

while (true) {

s = reader.readLine();

if (s == null)

break;

// 由于目前尚未确定以何种方式发送,所以先打出log日志。

CLog.e(TAG, s);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally { // 关闭流

try {

reader.close();

fis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

5,图片API类

public class ImageAPI {

public static Bitmap getImageByFilePath(String filePath, int scale) {

Bitmap res = null;

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(filePath, options);

options.inJustDecodeBounds = false;

options.inSampleSize = scale;

options.inPreferredConfig = Bitmap.Config.ARGB_4444;

return res;

}

public static Bitmap getImageByFilePath(String filePath, int Towidth, int ToHeight) {

Bitmap res = null;

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

if (!new File(filePath).exists())

return res;

BitmapFactory.decodeFile(filePath, options);

int origionalWidth = options.outHeight;

int origionalHeight = options.outWidth;

options.inJustDecodeBounds = false;

int scale = Math.max(origionalWidth / Towidth, origionalHeight / ToHeight);

options.inSampleSize = scale;

options.inPreferredConfig = Bitmap.Config.ARGB_4444;

try {

res = BitmapFactory.decodeFile(filePath, options);

} catch (Exception e) {

e.printStackTrace();

return null;

} catch (OutOfMemoryError e) {

e.printStackTrace();

return null;

}

return res;

}

}

6,提醒封装类

public static void showToast(Context ctx, int id, String str) {

if (str == null) {

return;

}

Toast toast = Toast.makeText(ctx, ctx.getString(id) + str, Toast.LENGTH_SHORT);

toast.setGravity(Gravity.CENTER, 0, 0);

toast.show();

}

public static void showToast(Context ctx, String errInfo) {

if (errInfo == null) {

return;

}

Toast toast = Toast.makeText(ctx, errInfo, Toast.LENGTH_SHORT);

toast.setGravity(Gravity.CENTER, 0, 0);

toast.show();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值