提交 efc3708a 编写于 作者: 门心叼龙's avatar 门心叼龙

utils update

上级 4d19c9df
package com.zjx.vcars.common.util;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
/**
* @Description
* @Author guojingbu
* @Date 2019/3/12
*/
public class AnimationUtils {
/**
* 从控件所在位置移动到控件的底部
*
* @return
*/
public static TranslateAnimation moveToBottom() {
TranslateAnimation hiddenAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 1.0f);
hiddenAction.setDuration(300);
return hiddenAction;
}
public static TranslateAnimation moveToLocation() {
TranslateAnimation visibleAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
visibleAction.setDuration(300);
return visibleAction;
}
}
package com.zjx.vcars.common.util;
import android.support.design.widget.AppBarLayout;
/**
* Description: <AppBarStateChangeListener><br>
* Author: gxl<br>
* Date: 2019/1/21<br>
* Version: V1.0.0<br>
* Update: <br>
*/
public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener {
public enum State {
EXPANDED,
COLLAPSED,
IDLE
}
private State mCurrentState = State.IDLE;
@Override
public final void onOffsetChanged(AppBarLayout appBarLayout, int i) {
if (i == 0) {
if (mCurrentState != State.EXPANDED) {
onStateChanged(appBarLayout, State.EXPANDED);
}
mCurrentState = State.EXPANDED;
} else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) {
if (mCurrentState != State.COLLAPSED) {
onStateChanged(appBarLayout, State.COLLAPSED);
}
mCurrentState = State.COLLAPSED;
} else {
if (mCurrentState != State.IDLE) {
onStateChanged(appBarLayout, State.IDLE);
}
mCurrentState = State.IDLE;
}
}
public abstract void onStateChanged(AppBarLayout appBarLayout, State state);
}
\ No newline at end of file
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.content.Context;
import android.graphics.Bitmap;
......@@ -9,6 +9,7 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.view.View.MeasureSpec;
......@@ -464,4 +465,14 @@ public class BitmapUtil {
}
return new int[]{coverWidth, coverHeight};
}
public static int getBitmapSize(Bitmap bitmap) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //API 19
return bitmap.getAllocationByteCount();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {//API 12
return bitmap.getByteCount();
}
// 在低版本中用一行的字节x高度
return bitmap.getRowBytes() * bitmap.getHeight(); //earlier version
}
}
package com.zjx.vcars.common.util;
import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import java.lang.reflect.Field;
/**
* Description: <解决使用的时候item数大于3个时会有位移><br>
* Author: gxl<br>
* Date: 2018/4/12<br>
* Version: V1.0.0<br>
* Update: <br>
*/
public class BotNavViewHelper {
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShifting(false);
//item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}
}
}
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.content.ComponentName;
import android.content.Context;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.text.TextUtils;
......@@ -18,7 +18,7 @@ import java.util.Date;
public class DateUtil {
public enum FormatType {
yyyy, yyyyMM, yyyyMMdd, yyyyMMddHHmm, yyyyMMddHHmmss, MMdd, HHmm
yyyy, yyyyMM, yyyyMMdd, yyyyMMddHHmm, yyyyMMddHHmmss, MMdd, HHmm,MM,dd;
}
/**
* 格式化时间字符串
......@@ -36,7 +36,13 @@ public class DateUtil {
Date date = parseTime(time);
return formatDate(date, type);
}
public static String formatDate(String time, FormatType fromtype,FormatType totype) {
if (TextUtils.isEmpty(time)) {
return "";
}
Date date = parseTime(time,fromtype);
return formatDate(date, totype);
}
public static String formatDate(Date time, FormatType type) {
if (time == null) {
return "";
......@@ -69,6 +75,12 @@ public class DateUtil {
case HHmm:
sdf = new SimpleDateFormat("HH:mm");
break;
case MM:
sdf = new SimpleDateFormat("MM");
break;
case dd:
sdf = new SimpleDateFormat("dd");
break;
default:
sdf = new SimpleDateFormat("yyyy-MM-dd");
break;
......@@ -296,4 +308,27 @@ public class DateUtil {
public static String getLaterTimeByDay(int day) {
return getLaterTimeByHour(day * 24);
}
/**
* 获取给定时间以后几天的时间戳
* @param date
* @param day
* @return
*/
public static String getLaterTimeByDay(String date,int day){
Calendar calendar = Calendar.getInstance();
calendar.setTime(parseTime(date, FormatType.yyyyMMdd));
calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + day * 24);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(calendar.getTime());
}
/**
* 获取当前时间的位置:一天24小时以半小时为单位划分为48个单元格
* @return
*/
public static int getCurrTimePosition() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
return (int)Math.ceil((double)(calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE)) / 30);
}
}
\ No newline at end of file
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.content.Context;
import com.fly.tour.common.BaseApplication;
import com.zjx.vcars.common.BaseApplication;
/**
* Description: <单位转换工具类><br>
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.app.ActivityManager;
import android.content.ComponentName;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.text.TextUtils;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.text.TextUtils;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.Manifest;
import android.app.Activity;
......@@ -8,8 +8,10 @@ import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.FileProvider;
import com.tbruyelle.rxpermissions2.RxPermissions;
import com.zjx.vcars.common.util.ToastUtil;
import java.io.File;
import java.text.SimpleDateFormat;
......@@ -20,17 +22,17 @@ import me.nereo.multi_image_selector.MultiImageSelector;
/**
* Description: <h3>多媒体工具类</h3>
* <ul>
* <li>1.图片选择器,可算多张图片</li>
* <li>2.拍照</li>
* <li>3.拍视频</li>
* <li>4.创建一个图片路径</li>
* <li>5.创建一个视频路径</li>
* </ul>
* <h3>注意事项:</h3>
* <ul><li>1. 拍照、拍视频、选择图片完成的回调都在onActivityResult中回调的</l1>
* <li>2.选择图片获取:List<String> path = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT)</li>
* </ul>
* <ul>
* <li>1.图片选择器,可算多张图片</li>
* <li>2.拍照</li>
* <li>3.拍视频</li>
* <li>4.创建一个图片路径</li>
* <li>5.创建一个视频路径</li>
* </ul>
* <h3>注意事项:</h3>
* <ul><li>1. 拍照、拍视频、选择图片完成的回调都在onActivityResult中回调的</l1>
* <li>2.选择图片获取:List<String> path = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT)</li>
* </ul>
* Author: gxl<br>
* Date: 2018/12/25<br>
* Version: V1.0.0<br>
......@@ -42,14 +44,14 @@ public class MultiMediaUtil {
public static final int TAKE_VIDEO = 1003;
/**
*
* 打开图片选择器,选择图片<br>
* 来获取图片
*
* @param activity
* @param count:选择图片个数
* @param requestcode
*/
public static void pohotoSelect(Activity activity, int count, int requestcode) {
public static void pohotoSelect(FragmentActivity activity, int count, int requestcode) {
pohotoSelect(activity, null, count, requestcode);
}
......@@ -57,21 +59,38 @@ public class MultiMediaUtil {
pohotoSelect(null, fragment, count, requestcode);
}
private static void pohotoSelect(Activity activity, Fragment fragment, int count, int requestcode) {
private static void pohotoSelect(final FragmentActivity activity, final Fragment fragment, final int count, final int requestcode) {
RxPermissions rxPermissions = null;
if (activity != null) {
MultiImageSelector.create().showCamera(false).count(count).single().multi()
//.origin(ArrayList<String>)
.start(activity, requestcode);
rxPermissions = new RxPermissions(activity);
} else if (fragment != null) {
MultiImageSelector.create().showCamera(false).count(count).single().multi()
//.origin(ArrayList<String>)
.start(fragment, requestcode);
rxPermissions = new RxPermissions(fragment);
}
rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) {
if (activity != null) {
MultiImageSelector.create().showCamera(false).count(count).single().multi()
//.origin(ArrayList<String>)
.start(activity, requestcode);
} else if (fragment != null) {
MultiImageSelector.create().showCamera(false).count(count).single().multi()
//.origin(ArrayList<String>)
.start(fragment, requestcode);
}
} else {
ToastUtil.showToast("无读写外部存储设备权限");
}
}
});
}
/**
* 拍照
*
* @param activity
* @param path:照片存放的路径
* @param requestcode
......@@ -105,11 +124,11 @@ public class MultiMediaUtil {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
if (activity != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(activity, "com.zjx.vcars.fileprovider", file));
activity.startActivityForResult(intent, requestcode);
} else if (fragment != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(fragment.getContext(), "com.zjx.vcars.fileprovider", file));
fragment.startActivityForResult(intent, requestcode);
}
}
......@@ -127,6 +146,7 @@ public class MultiMediaUtil {
/**
* 拍视频
*
* @param activity
* @param path:视频存放的路径
* @param requestcode
......@@ -159,10 +179,12 @@ public class MultiMediaUtil {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
//intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
if (activity != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(activity, "com.zjx.vcars.fileprovider", file));
activity.startActivityForResult(intent, requestcode);
} else if (fragment != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(fragment.getContext(), "com.zjx.vcars.fileprovider", file));
fragment.startActivityForResult(intent, requestcode);
}
......
package com.zjx.vcars.common.util;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
/**
* Description: <><br>
* Author: gxl<br>
* Date: 2019/1/2<br>
* Version: V1.0.0<br>
* Update: <br>
*/
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
}
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;
import com.zjx.vcars.common.BaseApplication;
import com.fly.tour.common.BaseApplication;
import static com.zjx.vcars.common.util.NetUtil.NetType.NET_4G;
import static com.zjx.vcars.common.util.NetUtil.NetType.NO_NET;
import static com.zjx.vcars.common.util.NetUtil.NetType.WIFI;
import static com.fly.tour.common.util.NetUtil.NetType.NET_4G;
import static com.fly.tour.common.util.NetUtil.NetType.NO_NET;
import static com.fly.tour.common.util.NetUtil.NetType.WIFI;
/**
* Description: <ToastUtil><br>
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import java.math.BigDecimal;
......
package com.zjx.vcars.common.util;
import android.Manifest;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
import com.tbruyelle.rxpermissions2.RxPermissions;
import io.reactivex.functions.Consumer;
/**
* Description: <PermissionCheckUtil><br>
* Author: gxl<br>
* Date: 2019/3/29<br>
* Version: V1.0.0<br>
* Update: <br>
*/
public class PermissionCheckUtil {
public static void check(FragmentActivity activity){
new RxPermissions(activity).request(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (!aBoolean) {
ToastUtil.showToast("缺少定位权限、存储权限,这会导致地图、导航、拍照等部分功能无法使用");
}
}
});
}
}
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
/**
* Description: <动态获取资源id><br>
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.app.Activity;
import android.content.Context;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.content.Context;
import android.content.pm.PackageManager;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.content.Context;
import android.view.View;
......
package com.fly.tour.common.util;
package com.zjx.vcars.common.util;
import android.widget.Toast;
import com.fly.tour.common.BaseApplication;
import com.zjx.vcars.common.BaseApplication;
/**
* Description: <吐司工具类><br>
......
package com.zjx.vcars.common.util;
import android.text.TextUtils;
import com.amap.api.maps.AMapUtils;
import com.amap.api.maps.model.LatLng;
import com.amap.api.trace.TraceLocation;
import java.util.ArrayList;
import java.util.List;
/**
* <h1>轨迹平滑所需要的工具方法</h1> Date: 2016-10-27 Created by gxl
*/
public class TrackMoveUtil {
private static double DISTANCE = 0.0001;
/**
* 根据两点算斜率
*/
public static double getSlope(LatLng fromPoint, LatLng toPoint) {
if (fromPoint == null || toPoint == null) {
return 0;
}
if (toPoint.longitude == fromPoint.longitude) {
return Double.MAX_VALUE;
}
double slope =
((toPoint.latitude - fromPoint.latitude) / (toPoint.longitude - fromPoint.longitude));
return slope;
}
/**
* 根据两点算取图标转的角度
*/
public static double getAngle(LatLng fromPoint, LatLng toPoint) {
if (fromPoint == null || toPoint == null) {
return 0;
}
double slope = getSlope(fromPoint, toPoint);
if (slope == Double.MAX_VALUE) {
if (toPoint.latitude > fromPoint.latitude) {
return 0;
} else {
return 180;
}
}
float deltAngle = 0;
if ((toPoint.latitude - fromPoint.latitude) * slope < 0) {
deltAngle = 180;
}
double radio = Math.atan(slope);
double angle = 180 * (radio / Math.PI) + deltAngle - 90;
return angle;
}
/**
* 根据点和斜率算取截距
*/
public static double getInterception(double slope, LatLng point) {
if (point == null) {
return 0;
}
return point.latitude - slope * point.longitude;
}
/**
* 计算x方向每次移动的距离
*/
public static double getXMoveDistance(double slope) {
if (slope == Double.MAX_VALUE) {
return DISTANCE;
}
return Math.abs((DISTANCE * slope) / Math.sqrt(1 + slope * slope));
}
/**
* 根据轨迹线段计算小车走了多少步
*
* @param latLngList
* @return
*/
public static int getStep(List<LatLng> latLngList) {
int step = 0;
if (latLngList != null && latLngList.size() > 1) {
for (int i = 0; i < latLngList.size() - 1; i++) {
try {
LatLng startPoint = latLngList.get(i);
LatLng endPoint = latLngList.get(i + 1);
double slope = getSlope(startPoint, endPoint);
// 是不是正向的标示(向上设为正向)
boolean isReverse = (startPoint.latitude > endPoint.latitude);
double xMoveDistance = isReverse ? getXMoveDistance(slope) : -1 * getXMoveDistance(slope);
// 应该对经纬度同时处理
for (double j = startPoint.latitude; !((j >= endPoint.latitude) ^ isReverse); j =
j - xMoveDistance) {
step++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return step;
}
/**
* 根据总距离和步数计算运动时间
*
* @param distance
* @param step
* @return
*/
public static double getMoveTime(float distance, int step) {
double timeInterval = 0;
if (distance > 0) {
float totalDistance = distance * 1000;
if (totalDistance <= 500) {
timeInterval = 1000.0 / step;
} else if (totalDistance > 500 && totalDistance <= 7500) {
timeInterval = 2.0 * totalDistance / step;
} else {
timeInterval = 15000.0 / step;
}
}
return timeInterval;
}
/**
* 根据轨迹点集合计算总距离
*
* @param latLngList
* @return
*/
public static float getDistance(List<LatLng> latLngList) {
float distance = 0;
if (latLngList != null && latLngList.size() > 1) {
for (int i = 0; i < latLngList.size() - 1; i++) {
try {
distance += AMapUtils.calculateLineDistance(latLngList.get(i), latLngList.get(i + 1));
} catch (Exception e) {
e.printStackTrace();
}
}
}
return distance;
}
// latitude - 地点的纬度,在-90 与90 之间的double 型数值。
// longitude - 地点的经度,在-180 与180 之间的double 型数值。
/**
* 根据一个经纬度字符串求一个经纬度集合a|b|c|d;
*
* @param latlonStr
* @return
*/
public static List<LatLng> getListLatLng(String latlonStr) {
if (!TextUtils.isEmpty(latlonStr)) {
String[] trackArr = latlonStr.split("\\|");
if (trackArr != null && trackArr.length > 0) {
List<LatLng> latLngList = new ArrayList<LatLng>();
for (int i = 0; i < trackArr.length - 1; i = i + 2) {
try {
String lat = trackArr[i + 1];
String lng = trackArr[i];
// Logger.v(TAG,"trackArr index:" + i);
// Logger.v(TAG,"trackArr lat:" + lat);
// Logger.v(TAG,"trackArr lng:" + lng);
if (!TextUtils.isEmpty(lat) && !TextUtils.isEmpty(lng)) {
Double dLat = Double.valueOf(lat);
Double dLng = Double.valueOf(lng);
if (dLat >= -90 && dLat <= 90 && dLng >= -180 && dLng <= 180
&& !(dLat == 0 && dLng == 0)) {
LatLng latLng = new LatLng(dLat, dLng);
latLngList.add(latLng);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return latLngList;
}
}
return null;
}
public static List<TraceLocation> getListTraceLocation(String latlonStr) {
if (!TextUtils.isEmpty(latlonStr)) {
String[] trackArr = latlonStr.split("\\|");
if (trackArr != null && trackArr.length > 0) {
List<TraceLocation> latLngList = new ArrayList<TraceLocation>();
for (int i = 0; i < trackArr.length - 1; i = i + 2) {
try {
String lat = trackArr[i + 1];
String lng = trackArr[i];
// Logger.v(TAG,"trackArr index:" + i);
// Logger.v(TAG,"trackArr lat:" + lat);
// Logger.v(TAG,"trackArr lng:" + lng);
if (!TextUtils.isEmpty(lat) && !TextUtils.isEmpty(lng)) {
Double dLat = Double.valueOf(lat);
Double dLng = Double.valueOf(lng);
if (dLat >= -90 && dLat <= 90 && dLng >= -180 && dLng <= 180) {
TraceLocation latLng = new TraceLocation();
latLng.setLatitude(dLat);
latLng.setLongitude(dLng);
latLngList.add(latLng);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return latLngList;
}
}
return null;
}
public static List<TraceLocation> getListTraceLocation(List<LatLng> latlngList) {
if (latlngList != null && latlngList.size() > 0) {
List<TraceLocation> traceLocationList = new ArrayList<TraceLocation>();
for (int i = 0; i < latlngList.size(); i++) {
LatLng latLng = latlngList.get(i);
TraceLocation traceLocation = new TraceLocation();
traceLocation.setLatitude(latLng.latitude);
traceLocation.setLongitude(latLng.longitude);
traceLocationList.add(traceLocation);
}
return traceLocationList;
}
return null;
}
}
package com.zjx.vcars.common.util.log;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.zjx.vcars.common.util.log.klog.BaseLog;
import com.zjx.vcars.common.util.log.klog.FileLog;
import com.zjx.vcars.common.util.log.klog.JsonLog;
import com.zjx.vcars.common.util.log.klog.XmlLog;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* This is a Log tool,with this you can the following
* <ol>
* <li>use KLog.d(),you could print whether the method execute,and the default tag is current class's name</li>
* <li>use KLog.d(msg),you could print log as before,and you could location the method with a click in Android Studio Logcat</li>
* <li>use KLog.json(),you could print json string with well format automatic</li>
* </ol>
*
* @author zhaokaiqiang
* github https://github.com/ZhaoKaiQiang/KLog
* 15/11/17 扩展功能,添加对文件的支持
* 15/11/18 扩展功能,增加对XML的支持,修复BUG
* 15/12/8 扩展功能,添加对任意参数的支持
* 15/12/11 扩展功能,增加对无限长字符串支持
* 16/6/13 扩展功能,添加对自定义全局Tag的支持,修复内部类不能点击跳转的BUG
* 16/6/15 扩展功能,添加不能关闭的KLog.debug(),用于发布版本的Log打印,优化部分代码
* 16/6/20 扩展功能,添加堆栈跟踪功能KLog.trace()
*/
public final class KLog {
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static final String NULL_TIPS = "Log with null object";
private static final String DEFAULT_MESSAGE = "execute";
private static final String PARAM = "Param";
private static final String NULL = "null";
private static final String TAG_DEFAULT = "KLog";
private static final String SUFFIX = ".java";
public static final int JSON_INDENT = 4;
public static final int V = 0x1;
public static final int D = 0x2;
public static final int I = 0x3;
public static final int W = 0x4;
public static final int E = 0x5;
public static final int A = 0x6;
private static final int JSON = 0x7;
private static final int XML = 0x8;
private static final int STACK_TRACE_INDEX_5 = 5;
private static final int STACK_TRACE_INDEX_4 = 4;
private static String mGlobalTag;
private static boolean mIsGlobalTagEmpty = true;
private static boolean IS_SHOW_LOG = true;
public static void init(boolean isShowLog) {
IS_SHOW_LOG = isShowLog;
}
public static void init(boolean isShowLog, @Nullable String tag) {
IS_SHOW_LOG = isShowLog;
mGlobalTag = tag;
mIsGlobalTagEmpty = TextUtils.isEmpty(mGlobalTag);
}
public static void v() {
printLog(V, null, DEFAULT_MESSAGE);
}
public static void v(Object msg) {
printLog(V, null, msg);
}
public static void v(String tag, Object... objects) {
printLog(V, tag, objects);
}
public static void d() {
printLog(D, null, DEFAULT_MESSAGE);
}
public static void d(Object msg) {
printLog(D, null, msg);
}
public static void d(String tag, Object... objects) {
printLog(D, tag, objects);
}
public static void i() {
printLog(I, null, DEFAULT_MESSAGE);
}
public static void i(Object msg) {
printLog(I, null, msg);
}
public static void i(String tag, Object... objects) {
printLog(I, tag, objects);
}
public static void w() {
printLog(W, null, DEFAULT_MESSAGE);
}
public static void w(Object msg) {
printLog(W, null, msg);
}
public static void w(String tag, Object... objects) {
printLog(W, tag, objects);
}
public static void e() {
printLog(E, null, DEFAULT_MESSAGE);
}
public static void e(Object msg) {
printLog(E, null, msg);
}
public static void e(String tag, Object... objects) {
printLog(E, tag, objects);
}
public static void a() {
printLog(A, null, DEFAULT_MESSAGE);
}
public static void a(Object msg) {
printLog(A, null, msg);
}
public static void a(String tag, Object... objects) {
printLog(A, tag, objects);
}
public static void json(String jsonFormat) {
printLog(JSON, null, jsonFormat);
}
public static void json(String tag, String jsonFormat) {
printLog(JSON, tag, jsonFormat);
}
public static void xml(String xml) {
printLog(XML, null, xml);
}
public static void xml(String tag, String xml) {
printLog(XML, tag, xml);
}
public static void file(File targetDirectory, Object msg) {
printFile(null, targetDirectory, null, msg);
}
public static void file(String tag, File targetDirectory, Object msg) {
printFile(tag, targetDirectory, null, msg);
}
public static void file(String tag, File targetDirectory, String fileName, Object msg) {
printFile(tag, targetDirectory, fileName, msg);
}
public static void debug() {
printDebug(null, DEFAULT_MESSAGE);
}
public static void debug(Object msg) {
printDebug(null, msg);
}
public static void debug(String tag, Object... objects) {
printDebug(tag, objects);
}
public static void trace() {
printStackTrace();
}
private static void printStackTrace() {
if (!IS_SHOW_LOG) {
return;
}
Throwable tr = new Throwable();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
tr.printStackTrace(pw);
pw.flush();
String message = sw.toString();
String traceString[] = message.split("\\n\\t");
StringBuilder sb = new StringBuilder();
sb.append("\n");
for (String trace : traceString) {
if (trace.contains("at com.socks.library.KLog")) {
continue;
}
sb.append(trace).append("\n");
}
String[] contents = wrapperContent(STACK_TRACE_INDEX_4, null, sb.toString());
String tag = contents[0];
String msg = contents[1];
String headString = contents[2];
BaseLog.printDefault(D, tag, headString + msg);
}
private static void printLog(int type, String tagStr, Object... objects) {
if (!IS_SHOW_LOG) {
return;
}
String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objects);
String tag = contents[0];
String msg = contents[1];
String headString = contents[2];
switch (type) {
case V:
case D:
case I:
case W:
case E:
case A:
BaseLog.printDefault(type, tag, headString + msg);
break;
case JSON:
JsonLog.printJson(tag, msg, headString);
break;
case XML:
XmlLog.printXml(tag, msg, headString);
break;
}
}
private static void printDebug(String tagStr, Object... objects) {
String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objects);
String tag = contents[0];
String msg = contents[1];
String headString = contents[2];
BaseLog.printDefault(D, tag, headString + msg);
}
private static void printFile(String tagStr, File targetDirectory, String fileName, Object objectMsg) {
if (!IS_SHOW_LOG) {
return;
}
String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objectMsg);
String tag = contents[0];
String msg = contents[1];
String headString = contents[2];
FileLog.printFile(tag, targetDirectory, fileName, headString, msg);
}
private static String[] wrapperContent(int stackTraceIndex, String tagStr, Object... objects) {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement targetElement = stackTrace[stackTraceIndex];
String className = targetElement.getClassName();
String[] classNameInfo = className.split("\\.");
if (classNameInfo.length > 0) {
className = classNameInfo[classNameInfo.length - 1] + SUFFIX;
}
if (className.contains("$")) {
className = className.split("\\$")[0] + SUFFIX;
}
String methodName = targetElement.getMethodName();
int lineNumber = targetElement.getLineNumber();
if (lineNumber < 0) {
lineNumber = 0;
}
String tag = (tagStr == null ? className : tagStr);
if (mIsGlobalTagEmpty && TextUtils.isEmpty(tag)) {
tag = TAG_DEFAULT;
} else if (!mIsGlobalTagEmpty) {
tag = mGlobalTag;
}
String msg = (objects == null) ? NULL_TIPS : getObjectsString(objects);
String headString = "[ (" + className + ":" + lineNumber + ")#" + methodName + " ] ";
return new String[]{tag, msg, headString};
}
private static String getObjectsString(Object... objects) {
if (objects.length > 1) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("\n");
for (int i = 0; i < objects.length; i++) {
Object object = objects[i];
if (object == null) {
stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(NULL).append("\n");
} else {
stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(object.toString()).append("\n");
}
}
return stringBuilder.toString();
} else {
Object object = objects[0];
return object == null ? NULL : object.toString();
}
}
}
package com.zjx.vcars.common.util.log;
import android.text.TextUtils;
import android.util.Log;
/**
* Created by zhaokaiqiang on 15/12/11.
*/
public class KLogUtil {
public static boolean isEmpty(String line) {
return TextUtils.isEmpty(line) || line.equals("\n") || line.equals("\t") || TextUtils.isEmpty(line.trim());
}
public static void printLine(String tag, boolean isTop) {
if (isTop) {
Log.d(tag, "╔═══════════════════════════════════════════════════════════════════════════════════════");
} else {
Log.d(tag, "╚═══════════════════════════════════════════════════════════════════════════════════════");
}
}
}
package com.zjx.vcars.common.util.log.klog;
import android.util.Log;
import com.zjx.vcars.common.util.log.KLog;
/**
* Created by zhaokaiqiang on 15/11/18.
*/
public class BaseLog {
private static final int MAX_LENGTH = 4000;
public static void printDefault(int type, String tag, String msg) {
int index = 0;
int length = msg.length();
int countOfSub = length / MAX_LENGTH;
if (countOfSub > 0) {
for (int i = 0; i < countOfSub; i++) {
String sub = msg.substring(index, index + MAX_LENGTH);
printSub(type, tag, sub);
index += MAX_LENGTH;
}
printSub(type, tag, msg.substring(index, length));
} else {
printSub(type, tag, msg);
}
}
private static void printSub(int type, String tag, String sub) {
switch (type) {
case KLog.V:
Log.v(tag, sub);
break;
case KLog.D:
Log.d(tag, sub);
break;
case KLog.I:
Log.i(tag, sub);
break;
case KLog.W:
Log.w(tag, sub);
break;
case KLog.E:
Log.e(tag, sub);
break;
case KLog.A:
Log.wtf(tag, sub);
break;
}
}
}
package com.zjx.vcars.common.util.log.klog;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Random;
/**
* Created by zhaokaiqiang on 15/11/18.
*/
public class FileLog {
private static final String FILE_PREFIX = "KLog_";
private static final String FILE_FORMAT = ".log";
public static void printFile(String tag, File targetDirectory, @Nullable String fileName, String headString, String msg) {
fileName = (fileName == null) ? getFileName() : fileName;
if (save(targetDirectory, fileName, msg)) {
Log.d(tag, headString + " save log success ! location is >>>" + targetDirectory.getAbsolutePath() + "/" + fileName);
} else {
Log.e(tag, headString + "save log fails !");
}
}
private static boolean save(File dic, @NonNull String fileName, String msg) {
File file = new File(dic, fileName);
try {
OutputStream outputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
outputStreamWriter.write(msg);
outputStreamWriter.flush();
outputStream.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private static String getFileName() {
Random random = new Random();
return FILE_PREFIX + Long.toString(System.currentTimeMillis() + random.nextInt(10000)).substring(4) + FILE_FORMAT;
}
}
package com.zjx.vcars.common.util.log.klog;
import android.util.Log;
import com.zjx.vcars.common.util.log.KLog;
import com.zjx.vcars.common.util.log.KLogUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by zhaokaiqiang on 15/11/18.
*/
public class JsonLog {
public static void printJson(String tag, String msg, String headString) {
String message;
try {
if (msg.startsWith("{")) {
JSONObject jsonObject = new JSONObject(msg);
message = jsonObject.toString(KLog.JSON_INDENT);
} else if (msg.startsWith("[")) {
JSONArray jsonArray = new JSONArray(msg);
message = jsonArray.toString(KLog.JSON_INDENT);
} else {
message = msg;
}
} catch (JSONException e) {
message = msg;
}
KLogUtil.printLine(tag, true);
message = headString + KLog.LINE_SEPARATOR + message;
String[] lines = message.split(KLog.LINE_SEPARATOR);
for (String line : lines) {
Log.d(tag, "║ " + line);
}
KLogUtil.printLine(tag, false);
}
}
package com.zjx.vcars.common.util.log.klog;
import android.util.Log;
import com.zjx.vcars.common.util.log.KLog;
import com.zjx.vcars.common.util.log.KLogUtil;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
/**
* Created by zhaokaiqiang on 15/11/18.
*/
public class XmlLog {
public static void printXml(String tag, String xml, String headString) {
if (xml != null) {
xml = XmlLog.formatXML(xml);
xml = headString + "\n" + xml;
} else {
xml = headString + KLog.NULL_TIPS;
}
KLogUtil.printLine(tag, true);
String[] lines = xml.split(KLog.LINE_SEPARATOR);
for (String line : lines) {
if (!KLogUtil.isEmpty(line)) {
Log.d(tag, "║ " + line);
}
}
KLogUtil.printLine(tag, false);
}
private static String formatXML(String inputXML) {
try {
Source xmlInput = new StreamSource(new StringReader(inputXML));
StreamResult xmlOutput = new StreamResult(new StringWriter());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
return xmlOutput.getWriter().toString().replaceFirst(">", ">\n");
} catch (Exception e) {
e.printStackTrace();
return inputXML;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册