Random random = new Random();
//產生隨機數 [20~11] 之間
int valueKqwd = random.nextInt((20- 11+ 1)) + 11;
String.format("%.1f",(double)valueKqwd/10);//向左移動一位小數點
((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()
/**
* 獲取當前時間
*/
public static String getTimes(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
/**
* 獲取網口的MAC地址
* @return 返回MAC值
*/
public static String getWireMac(){
String strMacAddress = null;
try {
byte[] b = NetworkInterface.getByName("eth0")
.getHardwareAddress();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < b.length; i++) {
if (i != 0) {
buffer.append(':');
}
System.out.println("b:"+(b[i]&0xFF));
String str = Integer.toHexString(b[i] & 0xFF);
buffer.append(str.length() == 1 ? 0 + str : str);
}
strMacAddress = buffer.toString().toUpperCase();
Log.d("TAG",strMacAddress);
} catch (Exception e) {
e.printStackTrace();
}
return strMacAddress;
}
/**
* 判斷某一時間是否在一個區間內
*
* @param sourceTime 時間區間,半閉合,如[10:00-20:00)
* @param curTime 需要判斷的時間 如10:00
* @return
* @throws IllegalArgumentException
*/
public static boolean isInTime(String sourceTime, String curTime) {
if (sourceTime == null || !sourceTime.contains("-") || !sourceTime.contains(":")) {
throw new IllegalArgumentException("Illegal Argument arg:" + sourceTime);
}
if (curTime == null || !curTime.contains(":")) {
throw new IllegalArgumentException("Illegal Argument arg:" + curTime);
}
String[] args = sourceTime.split("-");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
long now = sdf.parse(curTime).getTime();
long start = sdf.parse(args[0]).getTime();
long end = sdf.parse(args[1]).getTime();
if (args[1].equals("00:00")) {
args[1] = "24:00";
}
if (end < start) {
if (now >= end && now < start) {
return false;
} else {
return true;
}
}
else {
if (now >= start && now < end) {
return true;
} else {
return false;
}
}
} catch (ParseException e) {
e.printStackTrace();
throw new IllegalArgumentException("Illegal Argument arg:" + sourceTime);
}
}
public class SoftKeyboardUtil {
/**
* 關閉系統的軟鍵盤
* @param activity
*/
public static void dismissSoftKeyboard(Activity activity)
{
View view = activity.getWindow().peekDecorView();
if (view != null)
{
InputMethodManager inputmanger = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
/**
* 16進制字符串轉化為字母ASCALL碼
*
* @param hex 要轉化的16進制數,用空格隔開
* 如:53 68 61 64 6f 77
* @return ASCALL碼
*/
public static String convertHexToAsCall(String hex) {
StringBuilder sb = new StringBuilder();
String[] split = hex.split(" ");
for (String str : split) {
int i = Integer.parseInt(str, 16);
if (i < 0x20 || i == 0x7F) {//過濾特殊字符
continue;
}
sb.append((char) i);
}
return sb.toString();
}
/**
* 16進制數組轉String
*
* @param data byte數組
* @return string
*/
public static String formatHex2String(byte[] data) {
final StringBuilder stringBuilder = new StringBuilder(data.length);
for (byte byteChar : data)
stringBuilder.append(String.format("%02X ", byteChar));
return stringBuilder.toString();
}
/**
* 16進制字符串轉換為Byte值
*
* @param src Byte字符串,每個Byte之間沒有分隔符,eg:616C6B
* @return byte[]
*/
public static byte[] hexStr2Bytes(String src) {
int m = 0, n = 0;
int l = src.length() / 2;
System.out.println(l);
byte[] ret = new byte[l];
for (int i = 0; i < l; i++) {
m = i * 2 + 1;
n = m + 1;
ret[i] = Byte.decode("0x" + src.substring(i * 2, m) + src.substring(m, n));
}
return ret;
}
/**
* 字符串轉換成十六進制字符串
*
* @param str 待轉換的ASCII字符串
* @return String 每個Byte之間沒有分隔,如: [616C6B]
*/
public static String str2HexStr(String str) {
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
// sb.append(' ');
}
return sb.toString().trim();
}
//byte 數組與 int 的相互轉換
public static int byteArrayToInt(byte[] b) {
return b[3] & 0xFF |
(b[2] & 0xFF) << 8 |
(b[1] & 0xFF) << 16 |
(b[0] & 0xFF) << 24;
}
public static byte[] intToByteArray(int a) {
return new byte[] {
(byte) ((a >> 24) & 0xFF),
(byte) ((a >> 16) & 0xFF),
(byte) ((a >> 8) & 0xFF),
(byte) (a & 0xFF)
};
}
/**
* 判斷權限集合
* permissions 權限數組
* return false-表示沒有改權限 true-表示權限已開啟
*/
public static boolean lacksPermissions(Context mContexts,String [] mPermissions) {
for (String permission : mPermissions) {
if (lacksPermission(mContexts, permission)) {
//沒有開啟權限
return false;
}
}
//權限已開啟
return true;
}
/**
* 判斷是否缺少權限
*/
private static boolean lacksPermission(Context mContexts, String permission) {
return ContextCompat.checkSelfPermission(mContexts, permission) == PackageManager.PERMISSION_DENIED;
}
/**
* 獲取版本號
* @param context
* @return
*/
public static String getVersionName(Context context) {
if (context != null) {
try {
return context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0)
.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
return "4.0.0";
}
/**
* 獲取版本
* @param context
* @return
*/
public static int getVersionCode(Context context) {
if (context != null) {
try {
return context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0)
.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
return 1;
}
/**
* 設置水印圖片在左上角
*
* @param context 上下文
* @param src
* @param watermark
* @param paddingLeft
* @param paddingTop
* @return
*/
public static Bitmap createWaterMaskLeftTop(Context context, Bitmap src, Bitmap watermark, int paddingLeft, int paddingTop) {
return createWaterMaskBitmap(src, watermark,
dp2px(context, paddingLeft), dp2px(context, paddingTop));
}
private static Bitmap createWaterMaskBitmap(Bitmap src, Bitmap watermark, int paddingLeft, int paddingTop) {
if (src == null) {
return null;
}
int width = src.getWidth();
int height = src.getHeight();
//創建一個bitmap
Bitmap newb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 創建一個新的和SRC長度寬度一樣的位圖
//將該圖片作為畫布
Canvas canvas = new Canvas(newb);
//在畫布 0,0坐標上開始繪制原始圖片
canvas.drawBitmap(src, 0, 0, null);
//在畫布上繪制水印圖片
canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);
// 保存
canvas.save();//Canvas.ALL_SAVE_FLAG
// 存儲
canvas.restore();
return newb;
}
/**
* 設置水印圖片在右下角
*
* @param context 上下文
* @param src
* @param watermark
* @param paddingRight
* @param paddingBottom
* @return
*/
public static Bitmap createWaterMaskRightBottom(Context context, Bitmap src, Bitmap watermark, int paddingRight, int paddingBottom) {
return createWaterMaskBitmap(src, watermark,
src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
}
/**
* 設置水印圖片到右上角
*
* @param context
* @param src
* @param watermark
* @param paddingRight
* @param paddingTop
* @return
*/
public static Bitmap createWaterMaskRightTop(Context context, Bitmap src, Bitmap watermark, int paddingRight, int paddingTop) {
return createWaterMaskBitmap(src, watermark,
src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
dp2px(context, paddingTop));
}
/**
* 設置水印圖片到左下角
*
* @param context
* @param src
* @param watermark
* @param paddingLeft
* @param paddingBottom
* @return
*/
public static Bitmap createWaterMaskLeftBottom(Context context, Bitmap src, Bitmap watermark, int paddingLeft, int paddingBottom) {
return createWaterMaskBitmap(src, watermark, dp2px(context, paddingLeft),
src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
}
/**
* 設置水印圖片到中間
*
* @param src
* @param watermark
* @return
*/
public static Bitmap createWaterMaskCenter(Bitmap src, Bitmap watermark) {
return createWaterMaskBitmap(src, watermark,
(src.getWidth() - watermark.getWidth()) / 2,
(src.getHeight() - watermark.getHeight()) / 2);
}
/**
* 給圖片添加文字到左上角
*
* @param context
* @param bitmap
* @param text
* @return
*/
public static Bitmap drawTextToLeftTop(Context context, Bitmap bitmap, String text, int size, int color, int paddingLeft, int paddingTop) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
paint.setTextSize(dp2px(context, size));
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
return drawTextToBitmap(context, bitmap, text, paint, bounds,
dp2px(context, paddingLeft),
dp2px(context, paddingTop) + bounds.height());
}
/**
* 繪制文字到右下角
*
* @param context
* @param bitmap
* @param text
* @param size
* @param color
* @return
*/
public static Bitmap drawTextToRightBottom(Context context, Bitmap bitmap, String text, int size, int color, int paddingRight, int paddingBottom) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
paint.setTextSize(dp2px(context, size));
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
return drawTextToBitmap(context, bitmap, text, paint, bounds,
bitmap.getWidth() - bounds.width() - dp2px(context, paddingRight),
bitmap.getHeight() - dp2px(context, paddingBottom));
}
/**
* 繪制文字到右上方
*
* @param context
* @param bitmap
* @param text
* @param size
* @param color
* @param paddingRight
* @param paddingTop
* @return
*/
public static Bitmap drawTextToRightTop(Context context, Bitmap bitmap, String text, int size, int color, int paddingRight, int paddingTop) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
paint.setTextSize(dp2px(context, size));
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
return drawTextToBitmap(context, bitmap, text, paint, bounds,
bitmap.getWidth() - bounds.width() - dp2px(context, paddingRight),
dp2px(context, paddingTop) + bounds.height());
}
/**
* 繪制文字到左下方
*
* @param context
* @param bitmap
* @param text
* @param size
* @param color
* @param paddingLeft
* @param paddingBottom
* @return
*/
public static Bitmap drawTextToLeftBottom(Context context, Bitmap bitmap, String text, int size, int color, int paddingLeft, int paddingBottom) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
paint.setTextSize(dp2px(context, size));
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
return drawTextToBitmap(context, bitmap, text, paint, bounds,
dp2px(context, paddingLeft),
bitmap.getHeight() - dp2px(context, paddingBottom));
}
/**
* 繪制文字到中間
*
* @param context
* @param bitmap
* @param text
* @param size
* @param color
* @return
*/
public static Bitmap drawTextToCenter(Context context, Bitmap bitmap, String text, int size, int color) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
paint.setTextSize(dp2px(context, size));
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
return drawTextToBitmap(context, bitmap, text, paint, bounds,
(bitmap.getWidth() - bounds.width()) / 2,
(bitmap.getHeight() + bounds.height()) / 2);
}
//圖片上繪制文字
private static Bitmap drawTextToBitmap(Context context, Bitmap bitmap, String text, Paint paint, Rect bounds, int paddingLeft, int paddingTop) {
android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
paint.setDither(true); // 獲取跟清晰的圖像采樣
paint.setFilterBitmap(true);// 過濾一些
if (bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
canvas.drawText(text, paddingLeft, paddingTop, paint);
return bitmap;
}
/**
* 縮放圖片
*
* @param src
* @param w
* @param h
* @return
*/
public static Bitmap scaleWithWH(Bitmap src, double w, double h) {
if (w == 0 || h == 0 || src == null) {
return src;
} else {
// 記錄src的寬高
int width = src.getWidth();
int height = src.getHeight();
// 創建一個matrix容器
Matrix matrix = new Matrix();
// 計算縮放比例
float scaleWidth = (float) (w / width);
float scaleHeight = (float) (h / height);
// 開始縮放
matrix.postScale(scaleWidth, scaleHeight);
// 創建縮放后的圖片
return Bitmap.createBitmap(src, 0, 0, width, height, matrix, true);
}
}
/**
* dip轉pix
*
* @param context
* @param dp
* @return
*/
public static int dp2px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
//1.首先在清單文件配置權限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
//2.然后邏輯代碼中首先要判斷是否是8.0及其以上的版本
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
if (getPackageManager().canRequestPackageInstalls()) { //是否開啟安裝應用權限 true為開啟,false為未開啟。
//檢查更新
checkUpdate();
} else {
DialogHandle.getHandle(mContext) //自定義彈框
.show(new DialogHandle.dialogOnclick() {
@Override
public void nativeCallback(NobgDialog dialog) {
dialog.dismiss();
}
@Override
public void positiveCallback(NobgDialog dialog) {
Uri packageruri = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageruri);
startActivityForResult(intent, 985);
dialog.dismiss();
}
})
.setTitle("溫馨提示")
.setNotice("請前往設置中開啟安裝應用所需的權限")
.setBtn_nativeTxt("取消")
.setBtn_positiveTxt("確定");
}
} else {
//檢查更新
checkUpdate();
}
//3.===================返回程序=================
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 985) {
//檢查更新
checkUpdate();
}
}
//TessBaseAPI初始化用到的第一個參數,是個目錄
public static final String DATAPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
//在DATAPATH中新建這個目錄
public static final String tessdata = DATAPATH + File.separator + "文件";
//assets中的文件名
public static String DEFAULT_LANGUAGE_NAME = "文件.txt";
//保存到SD卡中的完整文件名
public static String LANGUAGE_PATH = tessdata + File.separator + DEFAULT_LANGUAGE_NAME;
//使用
/**
* 檢測sd卡是否存在
* 若不存在,從assets獲取到本地sd卡
*/
if (!checkTrainedDataExists()) {
SDUtils.assets2SD(context.getApplicationContext(), LANGUAGE_PATH, DEFAULT_LANGUAGE_NAME);
}
private static boolean checkTrainedDataExists() {
File file = new File(LANGUAGE_PATH);
return file.exists();
}
public class SDUtils {
/**
* 將assets中的文件復制到SD卡中
*
* @param path 要存放在SD卡中的 完整的文件名。這里是"/storage/emulated/0/tessdata/文件"
* @param name assets中的文件名 這里是 "文件"
*/
public static void assets2SD(Context context, String path, String name) {
//如果存在就刪掉
File f = new File(path);
if (f.exists()) {
f.delete();
}
if (!f.exists()) {
File p = new File(Objects.requireNonNull(f.getParent()));//返回此抽象路徑名父目錄的路徑名字符串
if (!p.exists()) {
p.mkdirs();//建立多級文件夾
}
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
InputStream is = null;
OutputStream os = null;
try {
//打開assets文件獲得一個InputStream字節輸入流
is = context.getAssets().open(name);
File file = new File(path);
// 創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流
os = new FileOutputStream(file);
byte[] bytes = new byte[4096];
int len = 0;
//從輸入流中讀取一定數量的字節,并將其存儲在緩沖區數組bytes中
//如果因為流位于文件末尾而沒有可用的字節,則返回值-1
while ((len = is.read(bytes)) != -1) {
//將指定byte數組中從偏移量off開始的len個字節寫入此緩沖的輸出流
os.write(bytes, 0, len);
}
//java在使用流時,都會有一個緩沖區,按一種它認為比較高效的方法來發數據:把要發的數據先放到緩沖區,
//緩沖區放滿以后再一次性發過去,而不是分開一次一次地發
//flush()強制將緩沖區中的數據發送出去,不必等到緩沖區滿
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//關閉輸入流和輸出流
if (is != null)
is.close();
if (os != null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 異或校驗
* @param data
* @return
*/
public static String getBCC(byte[] data) {
String ret = "";
byte BCC[] = new byte[1];
for (int i = 0; i < data.length; i++) {
BCC[0] = (byte) (BCC[0] ^ data[i]);
}
String hex = Integer.toHexString(BCC[0] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
return ret;
}
- 將字符串編碼成16進制數字,適用于所有字符(包括中文)
private static String hexString = "0123456789ABCDEF";
/**
* 將字符串編碼成16進制數字,適用于所有字符(包括中文)
*/
public static String encode(String str) {
// 根據默認編碼獲取字節數組
byte[] bytes = str.getBytes(Charset.forName("GBK"));
StringBuilder sb = new StringBuilder(bytes.length * 2);
// 將字節數組中每個字節拆解成2位16進制整數
for (byte aByte : bytes) {
sb.append(hexString.charAt((aByte & 0xf0) >> 4));
sb.append(hexString.charAt((aByte & 0x0f)));
}
return sb.toString();
}