JKBaseLib/BaseLibrary/src/main/java/com/tfq/library/utils/AppUtil.java

723 lines
26 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.tfq.library.utils;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.text.TextUtils;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import androidx.core.content.FileProvider;
import com.gyf.immersionbar.BarHide;
import com.gyf.immersionbar.ImmersionBar;
import com.tfq.library.app.LibraryApp;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.lang.reflect.Field;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class AppUtil {
/**
* 获取屏幕分辨率?
*
* @param context
* @return
*/
public static int[] getScreenDispaly(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
@SuppressWarnings("deprecation") int width = windowManager.getDefaultDisplay().getWidth();
@SuppressWarnings("deprecation") int height = windowManager.getDefaultDisplay().getHeight();
int[] result = {width, height};
return result;
}
/**
* 获取app的名称
*
* @param context
* @return
*/
public static String getAppName(Context context) {
String appName = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
int labelRes = packageInfo.applicationInfo.labelRes;
appName = context.getResources().getString(labelRes);
} catch (Throwable e) {
e.printStackTrace();
}
return appName;
}
/**
* 获取app的名称
*
* @param context
* @return
*/
public static String getAppVersionNameCode(Context context) {
String appCode = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
String versionName = packageInfo.versionName;
String versionCode = packageInfo.versionCode + "";
appCode = "versionName=" + versionName + " versionCode=" + versionCode;
} catch (Throwable e) {
e.printStackTrace();
}
return appCode;
}
/**
* 获取app的名称
*
* @param context
* @return
*/
public static String getPackageName(Context context) {
String name = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
name = packageInfo.applicationInfo.packageName;
} catch (Throwable e) {
e.printStackTrace();
}
return name;
}
/**
* 获取app的名称
*
* @return
*/
public static String getPackageName() {
String name = "";
try {
PackageManager packageManager = LibraryApp.getContext().getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(LibraryApp.getContext().getPackageName(), 0);
name = packageInfo.applicationInfo.packageName;
} catch (Throwable e) {
e.printStackTrace();
}
return name;
}
/**
* @param mContext 上下文
* @param title title
* @param message message
* @param ok 确定按钮
* @param cancel 返回按钮
* @param orNull 是否可以为空false设置为默认title message ok cancel
*/
public static void securitySD(Activity mContext, String title, String message, String ok, String cancel, boolean orNull) {
if (mContext != null) {
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
String s_title = title;
String s_message = message;
String s_ok = ok;
String s_cancel = cancel;
if (!orNull) {
s_title = "温馨提示";
if (!TextUtils.isEmpty(title)) {
s_title = title;
}
s_message = "请在应用详情页面权限列表进行设置。";
if (!TextUtils.isEmpty(message)) {
s_message = message;
}
s_ok = "确定";
if (!TextUtils.isEmpty(ok)) {
s_ok = ok;
}
s_cancel = "返回";
if (!TextUtils.isEmpty(cancel)) {
s_cancel = cancel;
}
}
AlertDialog alertDialog = new AlertDialog.Builder(mContext).setTitle(s_title).setMessage(s_message).setPositiveButton(s_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setNegativeButton(s_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setCancelable(false).create();
alertDialog.show();
}
});
}
}
public static void securitySD(Activity mContext, String title, String message, String ok, String cancel) {
if (mContext != null) {
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
String s_title = "温馨提示";
if (!TextUtils.isEmpty(title)) {
s_title = title;
}
String s_message = "请在应用详情页面权限列表进行设置。";
if (!TextUtils.isEmpty(message)) {
s_message = message;
}
String s_ok = "确定";
if (!TextUtils.isEmpty(ok)) {
s_ok = ok;
}
String s_cancel = "返回";
if (!TextUtils.isEmpty(cancel)) {
s_cancel = cancel;
}
AlertDialog alertDialog = new AlertDialog.Builder(mContext).setTitle(s_title).setMessage(s_message).setPositiveButton(s_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", mContext.getPackageName(), null));
mContext.startActivity(intent);
}
}).setNegativeButton(s_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setCancelable(false).create();
alertDialog.show();
}
});
}
}
public static void securitySD(Activity mContext, String title, String message, String ok) {
if (mContext != null) {
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
String s_title = "温馨提示";
if (!TextUtils.isEmpty(title)) {
s_title = title;
}
String s_message = "";
if (!TextUtils.isEmpty(message)) {
s_message = message;
}
String s_ok = "";
if (!TextUtils.isEmpty(ok)) {
s_ok = ok;
}
AlertDialog alertDialog = new AlertDialog.Builder(mContext).setTitle(s_title).setMessage(s_message).setPositiveButton(s_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mContext.finish();
}
}).setCancelable(false).create();
alertDialog.show();
}
});
}
}
public static void installApk(Context mContext, String downloadApk) {
Intent intent = new Intent(Intent.ACTION_VIEW);
File file = new File(downloadApk);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//这里要注意FileProvider一定要在AndroidManifest中去声明哦
//同时com.mc.mcplatform代表你自己的包名
Uri apkUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".provider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
}
mContext.startActivity(intent);
}
public static boolean connectStatus(Context context) {
boolean isConnect = true;
try {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
isConnect = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return isConnect;
}
public static boolean connectStatus() {
boolean isConnect = true;
try {
ConnectivityManager manager = (ConnectivityManager) LibraryApp.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
isConnect = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return isConnect;
}
public static boolean isRunningForeground(Context mContext) {
try {
ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(mContext.getPackageName())) {
return appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return false;
}
public static ActivityInfo[] getAllActivity(Context mContext) {
ActivityInfo[] activities = null;
PackageManager packageManager = mContext.getPackageManager();
PackageInfo packageInfo = null;
try {
packageInfo = packageManager.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
//所有的Activity
activities = packageInfo.activities;
// for (ActivityInfo activity : activities) {
// Class<?> aClass = Class.forName(activity.name);
// }
} catch (Exception e) {
e.printStackTrace();
}
return activities;
}
public static void exitActivity(Context mContext) {
ActivityInfo[] activities = getAllActivity(mContext);
if (activities != null && activities.length > 0) {
for (int i = 0; i < activities.length; i++) {
ActivityInfo activity = activities[i];
String name = activity.name;
LogK.e("mContext.getPackageName()=" + mContext.getPackageName());
if (name.startsWith(mContext.getPackageName())) {
Activity currentActivity = getCurrentActivity(name);
if (currentActivity != null) currentActivity.finish();
LogK.e("name=" + name);
}
}
}
}
private static Activity getCurrentActivity(String name) {
try {
Class activityThreadClass = Class.forName(name);
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
activitiesField.setAccessible(true);
Map activities = (Map) activitiesField.get(activityThread);
for (Object activityRecord : activities.values()) {
Class activityRecordClass = activityRecord.getClass();
Field pausedField = activityRecordClass.getDeclaredField("paused");
pausedField.setAccessible(true);
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Activity activity = (Activity) activityField.get(activityRecord);
return activity;
}
}
return null;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取app的VersionName
*
* @param context
* @return
*/
public static String getAppVersionName(Context context) {
String appVersionName = "1";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
appVersionName = packageInfo.versionName;
} catch (Throwable e) {
e.printStackTrace();
}
return appVersionName;
}
/**
* 获取app的VersionName
*
* @return
*/
public static String getAppVersionName() {
String appVersionName = "1";
try {
PackageManager packageManager = LibraryApp.getContext().getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(LibraryApp.getContext().getPackageName(), 0);
appVersionName = packageInfo.versionName;
} catch (Throwable e) {
e.printStackTrace();
}
return appVersionName;
}
/**
* 获取app的VersionCode
*
* @param context
* @return
*/
public static String getAppVersionCode(Context context) {
String appVersionCode = "1";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
appVersionCode = packageInfo.versionCode + "";
} else {
appVersionCode = packageInfo.getLongVersionCode() + "";
}
} catch (Exception e) {
e.printStackTrace();
}
return appVersionCode;
}
/**
* 获取app的VersionCode
*
* @return
*/
public static String getAppVersionCode() {
String appVersionCode = "1";
try {
PackageManager packageManager = LibraryApp.getContext().getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(LibraryApp.getContext().getPackageName(), 0);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
appVersionCode = packageInfo.versionCode + "";
} else {
appVersionCode = packageInfo.getLongVersionCode() + "";
}
} catch (Exception e) {
e.printStackTrace();
}
return appVersionCode;
}
public static boolean regexPhoneNum(String phone) {
String telRegex = "^1[3-9]\\d{9}$";
if (TextUtils.isEmpty(phone)) {
return false;
} else {
return phone.matches(telRegex);
}
}
/**
* 正则是不是纯数字
*
* @param string
* @return
*/
public static boolean regexIsNumber(String string) {
String str = "[0-9]*";
boolean matches = string.matches(str);
return matches;
}
/**
* 判断字符串是否为整数或小数(含正负数)
* @param input 待检测字符串
* @return true-是数字false-不是数字
*/
public static boolean isNumeric(String input) {
if (input == null || input.isEmpty()) return false;
// 正则解释:
// ^-? : 可选负号开头
// \\d+ : 至少一位整数
// (\\.\\d+)?: 可选小数部分
return input.matches("^-?\\d+(\\.\\d+)?$");
}
// 扩展方法:区分整数和小数
public static boolean isInteger(String input) {
return input != null && input.matches("^-?\\d+$");
}
public static boolean isDecimal(String input) {
return input != null && input.matches("^-?\\d+\\.\\d+$");
}
public static void getActivityName(Context context) {
Activity activityByContext = getActivityByContext(context);
if (activityByContext != null) {
String localClassName = activityByContext.getLocalClassName();
LogK.e("localClassName=" + localClassName);
}
}
private static Activity getActivityByContext(Context context) {
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
public static String getTopActivityName(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> listTask = activityManager.getRunningTasks(0);
String activityName = "";
if (listTask != null && !listTask.isEmpty()) {
ActivityManager.RunningTaskInfo runningTaskInfo = listTask.get(1);
activityName = runningTaskInfo.topActivity.getClassName();
}
return activityName;
}
public static String getTopActivity(Context context) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1);
if (runningTaskInfos != null) {
return (runningTaskInfos.get(0).topActivity.getClassName());
} else return null;
}
public static String getPublicKey(byte[] signature) {
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));
LogK.i("监听2" + " 22");
String publickey = cert.getPublicKey().toString();
LogK.d("-------密码TRACK " + publickey);
// publickey = publickey.substring(publickey.indexOf("modulus:") + 9,publickey.indexOf("\n", publickey.indexOf("modulus:")));
LogK.d("-------密码TRACK " + publickey);
return publickey;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] getSign(Context context) {
PackageManager pm = context.getPackageManager();
List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
Iterator<PackageInfo> iter = apps.iterator();
LogK.i("签名1 " + iter + "");
LogK.i("监听1 " + "----------");
while (iter.hasNext()) {
PackageInfo info = iter.next();
String packageName = info.packageName;
//按包名 取签名
if (packageName.equals(AppUtil.getPackageName(context))) {
LogK.i("监听1 " + info.signatures[0].toByteArray() + "----------");
return info.signatures[0].toByteArray();
}
}
return null;
}
/**
* 格式化时间
*/
public static String stringForTime(int timeMs) {
int totalSeconds = timeMs / 1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
if (hours > 0) {
return String.format(Locale.getDefault(), "%d:%02d:%02d", hours, minutes, seconds);
} else {
return String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
}
}
/**
* 根据给定的大小返回合适的单位KB、MB、GB
*
* @param sizeInBytes 字节数
* @return 格式化后的字符串
*/
public static String getSizeInUnit(long sizeInBytes) {
if (sizeInBytes < 1024) {
return sizeInBytes + " B";
} else if (sizeInBytes < 1024 * 1024) {
return String.format("%.2f KB", sizeInBytes / 1024.0);
} else if (sizeInBytes < 1024 * 1024 * 1024) {
return String.format("%.2f MB", sizeInBytes / (1024.0 * 1024.0));
} else {
return String.format("%.2f GB", sizeInBytes / (1024.0 * 1024.0 * 1024.0));
}
}
/**
* 清除缓存
*
* @param context
*/
public static void clearApplicationCache(Context context) {
File cache = context.getCacheDir();
if (cache != null && cache.isDirectory()) {
deleteDir(cache);
}
}
/**
* 执行循环清除
*
* @param dir
* @return
*/
private static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// The directory is now empty so delete it
return dir.delete();
}
/**
* 手机存储百分比
*/
public static void queryStorage(TextView textView) {
StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath());
//存储块总数量
long blockCount = statFs.getBlockCount();
//块大小
long blockSize = statFs.getBlockSize();
//可用块数量
long availableCount = statFs.getAvailableBlocks();
//剩余块数量这个包含保留块including reserved blocks即应用无法使用的空间
long freeBlocks = statFs.getFreeBlocks();
//这两个方法是直接输出总内存和可用空间也有getFreeBytes//API level 18JELLY_BEAN_MR2引入
long totalSize = statFs.getTotalBytes();
long availableSize = statFs.getAvailableBytes();
long all = totalSize + availableSize;
int percentage = (int) (totalSize * 100 / (totalSize + availableSize));
textView.setText(getUnit(totalSize) + "/" + getUnit(all));
}
/*** 单位转换*/
private static String getUnit(float size) {
String[] units = {"B", "KB", "MB", "GB", "TB"};
int index = 0;
while (size > 1024 && index < 4) {
size = size / 1024;
index++;
}
return String.format(Locale.getDefault(), " %.2f %s", size, units[index]);
}
/**
* 隐藏状态栏和导航栏
*/
public static void setHideBar_StatusAndNavigation(Context mContext) {
ImmersionBar.with((Activity) mContext)
.hideBar(BarHide.FLAG_HIDE_STATUS_BAR)
.hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR)
.init();
}
/**
* 关闭软键盘
*/
public static void closeKeyBoard(View currentFocus) {
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
InputMethodManager imm = (InputMethodManager) LibraryApp.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关闭软键盘
*/
public static void closeKeyBoard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View focusView = activity.getCurrentFocus();
// 优先使用当前焦点视图的窗口令牌
if (focusView != null) {
imm.hideSoftInputFromWindow(focusView.getWindowToken(), 0);
} else {
// 无焦点视图时使用Activity的窗口令牌
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
}
}