常用的一些工具类

安卓基础开发库,让开发简单点。
DevRing & Demo地址https://github.com/LJYcoder/DevRing

前言

几乎每个项目都会有各种各样的工具类,在开发中通过它们可更直接方便地实现功能。下面将介绍一些比较常用的工具类,而具体的实现请下载demo查看代码。


介绍

1. Log打印

demo中提供了RingLog工具类(出自ZhaoKaiQiang),和普通的Log一样包含Verbose、Debug、Info、Warn、Error、Assert几个等级,还支持将json或xml文本格式化后输出。
使用:
1)控制是否打印。正式打包上线时可设为false:

RingLog.init(true);

2)打印

//比如打印Error级日志
RingLog.e(TAG, message);

//将jsonString格式化后打印出来
RingLog.json(TAG, jsonString);

//将xmlString格式化后打印出来
RingLog.xml(TAG, xmlString);

这个Log工具类一个很大的好处是,你可以快速地跟踪到调用打印的具体位置。如图:

Log跟踪1

点击MoviePresenter即可定位到输出打印的位置

Log跟踪2

2. 崩溃打印

demo中提供了CrashDiary工具类,用于在程序崩溃时,输出异常日志到手机本地文件中,方便在没连接电脑时查看异常信息。可指定异常信息所输出的文件(位置)

程序崩溃时,即可到对应的位置下查看异常信息,如图:


查看崩溃日志1
查看崩溃日志2

3. 手机系统类型

demo中提供了SystemTypeUtil工具类,用于处理与手机系统类型相关的事件。
部分手机的系统是基于原生Android系统改造的(如小米,魅族),所以在有些功能的实现上需要做兼容处理,如设置状态栏中图文的颜色模式、跳转到权限管理页面。

  • 判断手机类型
boolean flag;
flag = SystemTypeUtil.isEMUI();//是否为华为手机
flag = SystemTypeUtil.isMIUI();//是否为小米手机
flag = SystemTypeUtil.isFlyme();//是否为魅族手机
  • 跳转到权限管理页面
//跳转,兼容不同手机系统类型
SystemTypeUtil.goToPermissionManager(context);
  • 设置状态栏中图文的颜色模式(深色模式或亮色模式)
boolean isDark = true;//true表示深色模式,false表示亮色模式
Window window = getWindow();
boolean flag = SystemTypeUtil.setStatusBarLightMode(window, isDark);//返回true表示设置成功

深色模式效果图:


深色模式

亮色模式效果图:


亮色模式

4. android 6.0权限申请

android6.0后(targetSdkVersion>=23)对于敏感权限,app需要向用户提出授权申请。
demo中提供了PermissionManager用于6.0版本的权限申请,使用RxPermisiion实现。

这里说下一般的申请流程:
1)在 AndroidManifest.xml 添加权限声明。
2)使用 checkSelfPermission 检查某个权限是否已经申请。
3)权限未申请,使用 requestPermissions 申请权限,然后会回调onRequestPermissionsResult。
4)在 onRequestPermissionsResult 回调中判断权限是否申请成功。
5)如果申请失败,则使用 shouldShowRequestPermissionRationale 判断用户是否勾选了 "不再提醒"。勾选了的话,则弹出一个 Dialog 引导用户到设置界面授予权限。没勾选的话,可以什么都不做,也可以弹出弹出一个 Dialog 引导用户到设置界面授予权限。

5. 网络状态

demo中提供了NetworkUtil工具类,用于查询网络状态

//当前网络是否可用,返回true表示可用,false表示不可以用
NetworkUtil.isNetWorkAvailable(context);

//当前网络是否为wifi网络,返回true表示是,false表示不是
NetworkUtil.isWifiConnected(context);

//当前网络是否为手机移动网络,返回true表示是,false表示不是
NetworkUtil.isMobileConnected(context);

...

6. File相关

demo中提供了FileUtil工具类,用于处理File相关的操作

  • SD卡是否能用
FileUtil.isSDCardAvailable();
  • 创建文件夹
/**
* 创建一个文件夹, 存在则返回, 不存在则新建
*
* @param String parentDirectory 父目录路径
* @param String directory  目录名
* @return 文件,null代表失败
*/
FileUtil.getDirectory(parentDirectory, directory);

/**
 * 创建一个文件夹, 存在则返回, 不存在则新建
 *
 * @param File parentDirectory 父目录
 * @param String directory  目录名
 * @return 文件,null代表失败
 */
 FileUtil.getDirectory(parentDirectory, directory)
  • 创建文件
/**
 * 创建一个文件, 存在则返回, 不存在则新建
 *
 * @param File catalog 父目录
 * @param String name    文件名
 * @return 文件,null代表失败
 */
 FileUtil.getFile(catalog, name);

/**
* 根据全路径创建一个文件
*
* @param filePath 文件全路径
* @return 文件,null代表失败
*/
FileUtil.getFile(filePath);
  • 删除文件
/**
* 删除文件/文件夹
* 如果是文件夹,则会删除其下的文件以及它本身
* @param file file
* @return true代表成功删除
*/
FileUtil.deleteFile(file);
  • 计算文件大小
/**
 * 计算文件/文件夹的大小
 * @param file 文件或文件夹
 * @return long 文件大小
 */
FileUtil.calculateFileSize(file);
  • 获取系统提供的文件夹路径
//返回"/data"目录
FileUtil.getDataDirectory();

//返回"/storage/emulated/0"目录
FileUtil.getExternalStorageDirectory();

//返回"/system"目录
FileUtil.getRootDirectory();

//返回"/cache"目录
FileUtil.getDownloadCacheDirectory();

//返回"/data/user/0/com.xxx.xxx/cache"目录
FileUtil.getCacheDir();

//返回"/data/user/0/com.xxx.xxx/files"目录
FileUtil.getFilesDir();

//返回"/storage/emulated/0/Android/data/com.xxx.xxx/cache"目录
FileUtil.getExternalCacheDir();

/**
 * @param String type 所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量
 * @return 返回"/storage/emulated/0/xxx"目录
 *         例如传入Environment.DIRECTORY_ALARMS则返回"/storage/emulated/0/Alarms"
 */
FileUtil.getExternalStoragePublicDirectory(type);

/**
 * @param String type 所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量
 * @return  返回"/storage/emulated/0/Android/data/com.xxx.xxx/files/Alarms"目录
 *          例如传入Environment.DIRECTORY_ALARMS则返回"/storage/emulated/0/Android/data/com.xxx.xxx/files/Alarms"
 */
FileUtil.getExternalFilesDir(type);

7. Activity栈管理

demo中提供了ActivityStackManager工具类,用于存放管理Activity栈。
使用流程:
1.在activity创建时调用pushOneActivity(Activity activity)推入栈,可放于Activity基类中

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mStackManager = ActivityStackManager.getInstance();
    mStackManager.pushOneActivity(this);
}

2.在activity销毁时调用popOneActivity(Activity activity)弹出栈,可放于Activity基类中

@Override
protected void onDestroy() {
    mStackManager.popOneActivity(this);
    super.onDestroy();
}

3.当你想要退出某个Activity时,可调用exitActivity(Class cls)

mStackManager.exitActivity(CollectActivity.class);

4.当你想要退出整个应用(所有Activity)时,可调用exitApplication()

mStackManager.exitApplication();

还提供了其他方法,具体请查看demo代码

8. 缓存

demo中提供了CacheManager,里面提供了内存缓存、磁盘缓存、SharedPreferences缓存。 其中磁盘缓存可定制缓存时长、位置、大小。
使用方法就是拿到相关的缓存管理,然后进行put和get操作。

9. Toast

demo中提供了RingToast工具类,方便吐司。
使用流程
1.Application中初始化

RingToast.init(this);//初始化吐司

2.在要吐司的地方调用show

RingToast.show("hello world");

RingToast.show(R.string.appName);

10. 密度单位转换

demo提供了DensityUtil工具类,用于密度单位的转换

  • px转dp
int dp = DensityUtil.px2dp(context, px);
  • dp转px
int px = DensityUtil.dp2px(context, dp);
  • sp转px
int px = DensityUtil.sp2px(context, sp);
  • px转sp
int sp = DensityUtil.px2sp(context, px);

11. ImageUtil

demo中提供了图片工具类,用于对图片进行压缩(比例压缩或质量压缩)、跳转到相机/相册、对Bitmap做高斯模糊处理等。

//从相机获取图片
ImageUtil.getImageFromCamera(context, mPhotoUri);
//从相册获取图片
ImageUtil.getImageFromAlbums(context);
//裁减图片为500*500尺寸,并且压缩图片为不大于3M的大小
bitmap = ImageUtil.qualityCompress(ImageUtil.scaleCompress(mFilePath, 500, 500), 3 * 1024);
...

12. 加密

demo中提供了EncryptUtil工具类,用于md5加密和sha1加密。

  • md5加密
String encrpt = EncryptUtil.md5Crypt(password.getBytes());
//加盐值
String encrpt = EncryptUtil.md5Crypt(password.getBytes(),salt);
  • sha1加密
String encrpt = EncryptUtil.sha1Crypt(password.getBytes());
//加盐值
String encrpt = EncryptUtil.sha1Crypt(password.getBytes(),salt);

13. 状态栏/导航栏颜色

提供了ColorBar工具类,用于沉浸式状态栏实现,来自https://github.com/Zackratos/UltimateBar,具体用法到里面查阅。

14. 其他

demo中还提供了一个CommonUtil,负责一些比较杂碎的功能,例如

  • 获取设备唯一ID号
String deviceId = CommonUtil.getDeviceUniqueId(context);
  • 创建/删除桌面快捷方式
//创建
CommonUtil.creatShortcut(context);
//删除
CommonUtil.delShortcut(context);
  • 扩展View的触摸范围
//扩大view上下左右10个单位触摸的范围
CommonUtil.expandViewTouchDelegate(view,10,10,10,10);
  • ...

另外,BlankJ提供了一个各种工具类的开源项目,大家各取所需吧。
https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md


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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,409评论 25 707
  • 安卓基础开发库,让开发简单点。DevRing & Demo地址:https://github.com/LJYcod...
    JYcoder阅读 4,457评论 2 17
  • 安卓基础开发库,让开发简单点。DevRing & Demo地址:https://github.com/LJYcod...
    JYcoder阅读 36,247评论 7 115
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • 嘿嘿,在这个春暖花开的季节里,最重要的是什么,出去浪呀~!爬山,骑车,跑步,各个都要来一发才不辜负了满园春光。 然...
    静静安静的炉阅读 171评论 0 1