Files
CubeAoleyunSN/app/src/main/java/com/aoleyun/sn/utils/Utils.java
tongtongstudio b381678756 feat(debug): 扩展 DebugActivity 系统控制功能
新增进程管理、默认桌面设置、通知渠道、快捷方式及多种系统配置接口
2026-08-28 17:09:25 +08:00

2080 lines
76 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.aoleyun.sn.utils;
import static android.content.Context.WIFI_SERVICE;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.os.SystemClock;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;
import com.aoleyun.sn.BuildConfig;
import com.aoleyun.sn.R;
import com.aoleyun.sn.comm.CommonConfig;
import com.aoleyun.sn.manager.AllwinnerCubeMdmManager;
import com.arialyy.aria.core.Aria;
import com.blankj.utilcode.util.FileUtils;
import com.google.gson.JsonObject;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.hjq.toast.Toaster;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.Reader;
import java.lang.reflect.Method;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import vendor.mediatek.hardware.nvram.V1_0.INvram;
public class Utils {
private static final String TAG = "Utils";
// MD5 设备地址标识
public static String getMAC(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 如果当前设备系统大于等于6.0 使用下面的方法
return getMac();
} else {
try {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
// 获取MAC地址
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String mac = wifiInfo.getMacAddress();
if (null == mac) {
// 未获取到
mac = "";
}
return mac;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
/**
* 获取手机的MAC地址
*
* @return
*/
public static String getMac() {
String str = "";
String macSerial = "";
try {
Process pp = Runtime.getRuntime().exec(
"cat /sys/class/net/wlan0/address");
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str; ) {
str = input.readLine();
if (str != null) {
macSerial = str.trim();// 去空格
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
if (macSerial == null || "".equals(macSerial)) {
try {
return loadFileAsString("/sys/class/net/eth0/address")
.toUpperCase().substring(0, 17);
} catch (Exception e) {
e.printStackTrace();
macSerial = getAndroid7MAC();
}
}
return macSerial;
}
public static String getAndroid10MAC(Context context) {
// if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
// return getMacAddress(context);
// } else {
// return getAndroid7MAC();
// }
return getAllMacAddress(context);
}
/**
* 兼容7.0获取不到的问题
*
* @return
*/
public static String getAndroid7MAC() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0"))
continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:", b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
}
return "";
}
@SuppressLint("HardwareIds")
@VisibleForTesting
public static String getMacAddress(Context mContext) {
WifiManager mWifiManager = (WifiManager) mContext.getSystemService(WIFI_SERVICE);
final String[] macAddresses = mWifiManager.getFactoryMacAddresses();
String macAddress = null;
if (macAddresses != null && macAddresses.length > 0) {
macAddress = macAddresses[0];
}
if (TextUtils.isEmpty(macAddress)) {
String mac = getMacFromFile();
// Add for CTCC Feature:WIFI MAC should be gotten while wifi disabled.
// Get Wifi MAC from file since we can not get it with WifiManager.
if (!TextUtils.isEmpty(mac)) {
macAddress = mac;
} else {
macAddress = "未能获取到MAC地址";
}
}
return macAddress;
}
/**
* Add for CTCC Feature:WIFI MAC should be gotten while wifi disabled.
* get Wifi MAC from /mnt/vendor/wifimac.txt
*
* @{
*/
private static String MACID_FILE_PATH = "/mnt/vendor/wifimac.txt";
private static String getMacFromFile() {
File file = new File(MACID_FILE_PATH);
BufferedReader reader = null;
String macAddress = null;
try {
reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
macAddress = line;
break;
}
} catch (FileNotFoundException e) {
Log.w(TAG, "Mac file not exist", e);
} catch (Exception e) {
Log.w(TAG, "get mac from file caught exception", e);
} finally {
try {
if (reader != null)
reader.close();
} catch (IOException e) {
Log.w(TAG, "reader close exception");
}
}
return macAddress;
}
public static String loadFileAsString(String fileName) throws Exception {
FileReader reader = new FileReader(fileName);
String text = loadReaderAsString(reader);
reader.close();
return text;
}
public static String loadReaderAsString(Reader reader) throws Exception {
StringBuilder builder = new StringBuilder();
char[] buffer = new char[4096];
int readLength = reader.read(buffer);
while (readLength >= 0) {
builder.append(buffer, 0, readLength);
readLength = reader.read(buffer);
}
return builder.toString();
}
/**
* 获取MAC地址
*
* @param context
* @return
*/
public static String getAllMacAddress(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return getMacDefault(context);
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
return getMacAddressM();
} else {
return getMacFromHardware();
}
}
/**
* Android 6.0 之前(不包括6.0)
*
* @param context
* @return
*/
private static String getMacDefault(Context context) {
String mac = "未获取到设备Mac地址";
if (context == null) {
return mac;
}
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = null;
try {
info = wifi.getConnectionInfo();
} catch (Exception e) {
e.printStackTrace();
}
if (info == null) {
return mac;
}
mac = info.getMacAddress();
if (!TextUtils.isEmpty(mac)) {
mac = mac.toUpperCase(Locale.ENGLISH);
}
return mac;
}
/**
* Android 6.0(包括) - Android 7.0(不包括)
*
* @return
*/
private static String getMacAddressM() {
String mac = "未获取到设备Mac地址";
try {
mac = new BufferedReader(new FileReader("/sys/class/net/wlan0/address")).readLine();
} catch (IOException e) {
e.printStackTrace();
}
return mac;
}
/**
* 遍历循环所有的网络接口,找到接口是 wlan0
*
* @return
*/
private static String getMacFromHardware() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) {
continue;
}
byte[] macBytes = nif.getHardwareAddress();
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:", b));
}
if (res1 != null) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return "未获取到设备Mac地址";
}
private static String getMacAddrApiS(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String mac = wifiInfo.getMacAddress();
return mac;
}
// MD5 设备地址标识
public static String getMD5(Context context) {
String WLANMAC = getMAC(context);
// compute md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
if (WLANMAC != null && !WLANMAC.equals("")) {
m.update(WLANMAC.getBytes(), 0, WLANMAC.length());
} else if (getSimSerialNumber(context) != null && !getSimSerialNumber(context).equals("")) {
m.update(getSimSerialNumber(context).getBytes(), 0, getSimSerialNumber(context).length());
} else {
m.update(getPesudoUniqueID().getBytes(), 0, getPesudoUniqueID().length());
}
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i = 0; i < p_md5Data.length; i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding)
if (b <= 0xF)
m_szUniqueID += "0";
// add number to string
m_szUniqueID += Integer.toHexString(b);
} // hex string to uppercase
m_szUniqueID = m_szUniqueID.toUpperCase();
return m_szUniqueID;
}
private static String getSimSerialNumber(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String simSerialNumber = tm.getSimSerialNumber();
return simSerialNumber;
}
private static String getPesudoUniqueID() {
String m_szDevIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length() % 10 +
Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 +
Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 +
Build.HOST.length() % 10 +
Build.ID.length() % 10 +
Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 +
Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 +
Build.TYPE.length() % 10 +
Build.USER.length() % 10;
return m_szDevIDShort;
}
// 防止连续点击
private static long lastClickTime;
public static boolean isFastDoubleClick() {
long time = System.currentTimeMillis();
long timeD = time - lastClickTime;
if (0 < timeD && timeD < 500) {
return true;
}
lastClickTime = time;
return false;
}
// 5分钟 = 1 转换成时间
public static String getRangeTime(int range) {
StringBuffer sBuffer = new StringBuffer();
String hour;
String minute;
if ((range / 12) >= 10) {
hour = range / 12 + "";
} else {
hour = "0" + range / 12 + "";
}
if ((range % 12) > 0) {
minute = ":" + range % 12 / 2 + "0";
} else {
minute = ":00";
}
sBuffer.append(hour.trim());
sBuffer.append(minute.trim());
return sBuffer.toString();
}
// 根据日期取得星期几
public static String getWeek(Date date) {
String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (week_index < 0) {
week_index = 0;
}
return weeks[week_index];
}
// 非空判断
public static boolean isEmpty(String s) {
if (null == s)
return true;
if (s.length() == 0)
return true;
if (s.trim().length() == 0)
return true;
return false;
}
// 手动隐藏键盘
public static void CloseKeyBoard(Context context) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
System.out.println("isActive:" + imm.isActive());
if (imm.isActive()) {
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
// 接受软键盘输入
public static void hideKeyboard(Context context, View view) {
if (context == null || view == null) {
return;
}
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
// 卸载app
public static void unInstallAPP(Context context, String packageName) {
if (!TextUtils.isEmpty(packageName) && !ApkUtils.isSystemApp(context, packageName)) {
if (ApkUtils.isSystemApp(context, packageName)) {
Toast.makeText(context, R.string.system_unistall_error, Toast.LENGTH_SHORT).show();
} else {
Uri packageURI = Uri.parse("package:" + packageName);
Intent intent = new Intent(Intent.ACTION_DELETE, packageURI);
context.startActivity(intent);
}
} else {
Toast.makeText(context, R.string.unistall_error, Toast.LENGTH_SHORT).show();
}
}
// 打开app
public static void startApp(Context context, String packageName,
String activityName) {
if (TextUtils.isEmpty(packageName))
return;
try {
Intent intent = null;
if (TextUtils.isEmpty(activityName)) {
intent = context.getPackageManager().getLaunchIntentForPackage(
packageName);
} else {
intent = new Intent();
intent.setComponent(new ComponentName(packageName, activityName));
}
if (intent == null) {
intent = getLaunchIntentForNoCategory(context, packageName);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Intent getLaunchIntentForNoCategory(Context context,
String packageName) {
Intent intent = null;
PackageManager packageManager = context.getPackageManager();
PackageInfo packageinfo = null;
try {
packageinfo = packageManager.getPackageInfo(packageName, 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (packageinfo == null) {
return null;
}
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.setPackage(packageinfo.packageName);
List<ResolveInfo> resolveinfoList = packageManager
.queryIntentActivities(resolveIntent, 0);
ResolveInfo resolveinfo = resolveinfoList.iterator().next();
if (resolveinfo != null) {
String className = resolveinfo.activityInfo.name;
intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
}
return intent;
}
// 设置系统亮度模式
public static void systemBrightness(Context context) {
try {
SharedPreferences mPrefs = context.getSharedPreferences("colorflykids", 0);
boolean initSetting = mPrefs.getBoolean("init_setting", true);
if (initSetting) {
mPrefs.edit().putBoolean("init_setting", false).commit();
}
Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
mPrefs.edit().putBoolean("first_init", false).commit();
} catch (Exception err) {
err.printStackTrace();
}
}
// 更新 版本比较
public static boolean isUpdate(String oldVersion, String newVersion) {
if (TextUtils.isEmpty(oldVersion) || TextUtils.isEmpty(newVersion) || oldVersion.equals(newVersion)) {
return false;
}
String[] oldVersionSp = oldVersion.replaceAll("[^.\\d]", "").trim().split("\\.");
String[] newVsersionSp = newVersion.replaceAll("[^.\\d]", "").trim().split("\\.");
int index = 0;
int minLen = Math.min(oldVersionSp.length, newVsersionSp.length);
int diff = 0;
while (index < minLen && (diff = Integer.parseInt(newVsersionSp[index]) - Integer.parseInt(oldVersionSp[index])) == 0) {
index++;
}
if (diff == 0) {
for (int i = index; i < oldVersionSp.length; i++) {
if (Integer.parseInt(oldVersionSp[i]) > 0) {
return false;
}
}
for (int i = index; i < newVsersionSp.length; i++) {
if (Integer.parseInt(newVsersionSp[i]) > 0) {
return true;
}
}
} else {
return diff > 0 ? true : false;
}
return false;
}
/***
* 半角转换为全角
*
* @param input
* @return
*/
public static String ToDBC(String input) {
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == 12288) {
c[i] = (char) 32;
continue;
}
if (c[i] > 65280 && c[i] < 65375)
c[i] = (char) (c[i] - 65248);
}
return new String(c);
}
public static boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = {0, 0};
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
public static boolean isIntent(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
}
// 检查网络连接,如果无网络可用,就不需要进行连网操作等
NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null || !networkinfo.isAvailable()) {
return false;
}
return true;
}
public static String getTime(int time) {
int min = time / 60;
int sec = time % 60;
if (sec > 0) {
return String.valueOf(min + 1);
} else {
return String.valueOf(min);
}
}
public static String getTimeClick(int time) {
StringBuffer timeClick = new StringBuffer();
int min = time / 60;
int sec = time % 60;
timeClick.append(min >= 10 ? (int) Math.ceil(min / 10) : 0)
.append(min % 10)
.append(":")
.append(sec >= 10 ? (int) Math.ceil(sec / 10) : 0)
.append(sec % 10);
return timeClick.toString();
}
public static String getVersionName(Context context) {
// 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo;
try {
packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
String version = packInfo.versionName.replaceAll("[a-zA-Z]", "").trim();
;
return version;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
//获取App版本号
public static String getAppVersionName(String pck, Context context) {
PackageManager pm = context.getPackageManager();
String versionName;
try {
PackageInfo packageInfo = pm.getPackageInfo(pck, 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
versionName = "";
}
return versionName;
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static float dp2px(Resources resources, float dp) {
final float scale = resources.getDisplayMetrics().density;
return dp * scale + 0.5f;
}
public static float sp2px(Resources resources, float sp) {
final float scale = resources.getDisplayMetrics().scaledDensity;
return sp * scale;
}
public static String getTime() {
long time = System.currentTimeMillis();//long now = android.os.SystemClock.uptimeMillis();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = new Date(time);
String t1 = format.format(d1);
return t1;
}
public static final String NOSN = "0123456789ABCDEF";
public static final String TECLAST_BRAND = "Teclast";
/**
* 获取设备序列号
*
* @return
*/
public static String getSerial(Context context) {
if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.HL500Platform) {
return getIMEI(context);
}
if (TECLAST_BRAND.equalsIgnoreCase(Build.BRAND)) {
return getPushMac(context);
} else {
// if (NOSN.equalsIgnoreCase(getSn())) {
// return getIMEI(context);
// } else {
return getSn();
// }
}
}
public static String getPushMac(Context context) {
String macaddr = Utils.getMacAddrFromNvram();
return macaddr.replace(":", "").toUpperCase().trim();
}
//mh add start----
private static final int MAC_ADDRESS_ID = 30;
private static final int MAC_ADDRESS_OFFSET = 4;
private static final int MAC_ADDRESS_DIGITS = 6;
private static final int MAX_ADDRESS_VALUE = 0xff;
private static final int INVALID_RSSI = -200;
private static final String MAC_ADDRESS_FILENAME = "/mnt/vendor/nvdata/APCFG/APRDEB/WIFI";
private static String getMacAddrFromNvram() {
StringBuffer nvramBuf = new StringBuffer();
try {
int i = 0;
String buff = null;
INvram agent = INvram.getService();
if (agent == null) {
// mToast.setText("No support MAC address writing due to NVRAM");
// mToast.show();
Log.e("mh_mac", "NvRAMAgent is null");
return "";
}
try {
buff = agent.readFileByName(
MAC_ADDRESS_FILENAME, MAC_ADDRESS_OFFSET + MAC_ADDRESS_DIGITS);
} catch (Exception e) {
e.printStackTrace();
return "";
}
Log.i("mh_mac", "Raw data:" + buff);
if (buff.length() < 2 * (MAC_ADDRESS_OFFSET + MAC_ADDRESS_DIGITS)) {
// mToast.setText("The foramt of NVRAM is not correct");
// mToast.show();
return "";
}
// Remove the \0 special character.
int macLen = buff.length() - 1;
for (i = MAC_ADDRESS_OFFSET * 2; i < macLen; i += 2) {
if ((i + 2) < macLen) {
nvramBuf.append(buff.substring(i, i + 2));
nvramBuf.append(":");
} else {
nvramBuf.append(buff.substring(i));
}
}
Log.d("mh_mac", "buff:" + nvramBuf.toString());
} catch (Exception e) {
e.printStackTrace();
return "";
}
return nvramBuf.toString();
}
//mh add end------
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getSn() {
// if (BuildConfig.DEBUG) {
// return "LTPHR23040000006";
// }
String serial = "unknow";
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {//9.0+
serial = Build.getSerial();
} else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+
serial = Build.SERIAL;
} else {//8.0-
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
serial = (String) get.invoke(c, "ro.serialno");
}
} catch (Exception e) {
e.printStackTrace();
Log.e("getSerial", "读取设备序列号异常:" + e.toString());
}
return serial;
}
public static String getDeviceSN() {
String serial = null;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
serial = (String) get.invoke(c, "persist.sys.hrSerial");
} catch (Exception e) {
e.printStackTrace();
}
return serial;
}
/**
* @return 获取第三方内置apk
*/
public static HashSet<String> getPackage() {
String packages = "";
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
packages = (String) get.invoke(c, "persist.sys.package");
} catch (Exception e) {
e.printStackTrace();
}
HashSet<String> packageSet = new HashSet<>();
if (TextUtils.isEmpty(packages)) {
return packageSet;
} else {
packageSet.addAll(Arrays.asList(packages.split(",")));
return packageSet;
}
}
public static final long A_GB = 1073741824;
public static final long A_MB = 1048576;
public static final int A_KB = 1024;
public static String fmtSpace(long space) {
if (space <= 0) {
return "0";
}
double gbValue = (double) space / A_GB;
if (gbValue >= 1) {
return String.format("%.2fGB", gbValue);
} else {
double mbValue = (double) space / A_MB;
// Log.e("GB", "gbvalue=" + mbValue);
if (mbValue >= 1) {
return String.format("%.2fMB", mbValue);
} else {
final double kbValue = space / A_KB;
return String.format("%.2fKB", kbValue);
}
}
}
public static Bitmap createQRImage(String content, int widthPix, int heightPix) {
try {
// if (content == null || "".equals(content)) {
// return false;
// }
//配置参数
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//容错级别
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//设置空白边距的宽度
hints.put(EncodeHintType.MARGIN, 1); //default is 4
// 图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = null;
try {
bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix,
heightPix, hints);
} catch (WriterException e) {
e.printStackTrace();
}
int[] pixels = new int[widthPix * heightPix];
// 下面这里按照二维码的算法,逐个生成二维码的图片,
// 两个for循环是图片横列扫描的结果
for (int y = 0; y < heightPix; y++) {
for (int x = 0; x < widthPix; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * widthPix + x] = 0xff000000;
} else {
pixels[y * widthPix + x] = 0xffffffff;
}
}
}
// 生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
//
// if (logoBm != null) {
// bitmap = addLogo(bitmap, logoBm);
// }
//必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,
// 内存消耗巨大!
return bitmap;
// return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Bitmap getRoundedBitmap(Bitmap mBitmap, Context context) {
Bitmap bgBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Bitmap mask = BitmapFactory.decodeResource(context.getResources(), R.drawable.mask);
int width = mask.getWidth();
int height = mask.getHeight();
Bitmap bitmapScale = Bitmap.createScaledBitmap(mBitmap, width, height, true);
// Palette p = Palette.from(mBitmap).generate();
// Palette.Swatch vibrant = p.getVibrantSwatch();//有活力的
// int color = vibrant.getRgb(); //样本中的像素数量
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
Paint paint = new Paint();
canvas.setBitmap(result);
// canvas.drawColor(color);
canvas.drawBitmap(mask, 0, 0, paint);
// paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmapScale, 0, 0, paint);
// return result;
Bitmap result2 = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas2 = new Canvas();
Paint paint2 = new Paint();
canvas2.setBitmap(result2);
canvas2.drawBitmap(mask, 0, 0, paint2);
paint2.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas2.drawBitmap(result, 0, 0, paint2);
return result2;
// Canvas mCanvas = new Canvas();
// mCanvas.setBitmap(bgBitmap);
// Paint mPaint = new Paint();
// RectF mRectM = new RectF(scaleM, scaleM, mBitmap.getWidth() - scaleM, mBitmap.getHeight() - scaleM); //设置剪裁圆角的区域
// Rect mRect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
// RectF mRectF = mRectM;
//
// float roundPx = 15; //圆角半径
// mPaint.setAntiAlias(true);
// //Log.d("wy"+TAG,"mBitmap.getWidth()="+mBitmap.getWidth()+", mBitmap.getHeight()="+mBitmap.getHeight());
// mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);
// mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
// mCanvas.drawBitmap(mBitmap, mRect, mRect, mPaint);
// return bgBitmap;
}
/**
* 获取系统保存的字段
*
* @param key
* @param defaultValue
* @return
*/
public static String getProperty(String key, String defaultValue) {
String value = defaultValue;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class, String.class);
value = (String) (get.invoke(c, key, defaultValue));
} catch (Exception e) {
e.printStackTrace();
} finally {
return value;
}
}
/**
* 重置系统
*
* @param context
*/
public static void doMasterClear(Context context) {
if (BuildConfig.DEBUG) {
Toaster.show("收到重置设备推送消息");
return;
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
Intent intent = new Intent("android.intent.action.FACTORY_RESET");
intent.setPackage("android");
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.putExtra("android.intent.extra.REASON", "MasterClearConfirm");
intent.putExtra("android.intent.extra.WIPE_EXTERNAL_STORAGE", false);
intent.putExtra("com.android.internal.intent.extra.WIPE_ESIMS", false);
context.sendBroadcast(intent);
} else {
//10.0的不需要最小电量
if (getBatteryLevel(context) >= CommonConfig.MIN_POWER) {
Intent intent = new Intent("android.intent.action.MASTER_CLEAR");
// intent.setPackage("com.android.settings");
context.sendBroadcast(intent);
} else {
MySQLData.SetBooleanData(context, CommonConfig.IS_RESET, true);
}
}
}
/**
* 更新应用白名单禁止升级
*
* @param context
* @param allowList 禁止
* @param disallowList 允许
* @return
*/
static public boolean writeDisableUpdateList(Context context, String[] allowList, String[] disallowList) {
String now = Settings.System.getString(context.getContentResolver(), CommonConfig.AOLE_ACTION_APP_FORBID);
String[] nowList;
List<String> allList;
if (now == null || "".equalsIgnoreCase(now)) {
allList = new ArrayList<>();
} else {
nowList = now.split(",");
allList = new ArrayList<>(Arrays.asList(nowList));//已经写入的列表
}
boolean writeSucceed = false;
if (allowList != null && allowList.length > 0) {
for (String s : allowList) {
if (ApkUtils.isAvailable(context, s)) {
allList.remove(s);
//去掉已经安装的
} else {
if (allList.indexOf(s) == -1) {
allList.add(s);
}
//没有安装就加入进去
//没有加入会导致安装后卸载不能再安装的情况
}
}
}
for (String s : disallowList) {
if (allList.indexOf(s) == -1) {
allList.add(s);
//没找到元素添加到白名单
}
}
if (allList.size() > 0) {
String list = "";
for (String str : allList) {
list += str + ",";
}
list = list.substring(0, list.length() - 1);
Log.e("fht", list);
writeSucceed = Settings.System.putString(context.getContentResolver(), CommonConfig.AOLE_ACTION_APP_FORBID, list);
Log.e("fht", "aole_app_forbid:" + list);
} else {
writeSucceed = Settings.System.putString(context.getContentResolver(), CommonConfig.AOLE_ACTION_APP_FORBID, "");
}
if (JgyUtils.isAllWinnerDevice()) {
try {
AllwinnerCubeMdmManager.getInstance().setInstallPackageWhiteList(allList);
writeSucceed = true;
} catch (Exception e) {
Log.e(TAG, "writeDisableUpdateList: " + e.getMessage());
writeSucceed = false;
}
}
return writeSucceed;
/*功能和应用安装白名单一样,首先会写入所有的app名单。
*如果已经安装就从白名单删除,没有安装的不用删除
*不然会出现安装不上的情况
*在写入白名单之后和安装完成之后执行
*/
}
/**
* 重启设备
*
* @param context
*/
public static void rebootDevices(Context context) {
Intent iReboot = new Intent(Intent.ACTION_REBOOT);
iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(iReboot);
}
public static String getFileNamefromURL(String url) {
int position = url.lastIndexOf("/");
return url.substring(position + 1);
}
private static String getMD5fromFileName(String fileName) {
int position = fileName.lastIndexOf("/");
return fileName.substring(position + 13, fileName.length() - 4);
}
/**
* 主要的下载
*
* @param context
* @param url
* @param jsonObject
*/
public static void ariaDownload(Context context, String url, JsonObject jsonObject) {
Log.e(TAG, "ariaDownload: " + jsonObject);
String fileName = getFileNamefromURL(url);
String urlMD5 = "";
if (jsonObject.get("MD5") == null) {
if (jsonObject.get("app_md5") != null) {
urlMD5 = jsonObject.get("app_md5").getAsString();
}
} else {
if (jsonObject.get("MD5") != null) {
if (!jsonObject.get("MD5").isJsonNull()) {
urlMD5 = jsonObject.get("MD5").getAsString();
}
}
}
Log.e("ariaDownload", "urlMD5=" + urlMD5);
String p = JgyUtils.getInstance().getDownLoadPath();
File file = new File(JgyUtils.getInstance().getDownLoadPath() + fileName);
if (file.exists() && !file.isDirectory()) {
String filenameMD5 = getMD5fromFileName(url);
String fileMD5 = FileUtils.getFileMD5ToString(file);
Log.e("ariaDownload", "filenameMD5=" + filenameMD5);
Log.e("ariaDownload", "fileMD5=" + fileMD5);
//后端还没有完成json字段的MD5,暂时用文件名获取
if (fileMD5.equalsIgnoreCase(urlMD5)) {
ApkUtils.installApp(context, file.getAbsolutePath());
} else {
Aria.download(context)
.load(url) //读取下载地址
.setFilePath(JgyUtils.getInstance().getDownLoadPath() + fileName)
.ignoreFilePathOccupy()
.setExtendField(jsonObject.toString())
.create(); //启动下载}
}
} else {
Aria.download(context)
.load(url) //读取下载地址
.setFilePath(JgyUtils.getInstance().getDownLoadPath() + fileName)
.ignoreFilePathOccupy()
.setExtendField(jsonObject.toString())
.create(); //启动下载}
}
}
private void showToast() {
}
/**
* 屏幕截图
* 适用于lanucher版
*/
public static void shotScreen(final Context context) {
//adb截图方法
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
String filepath = context.getCacheDir().getAbsolutePath();
long time = System.currentTimeMillis();
int n = CmdUtil.execute("screencap -p " + filepath + File.separator + time + ".db").code;
e.onNext(n);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
if (integer == 0) {
Log.e("doss", "成功");
} else {
Log.e("doss", "失败");
}
}
@Override
public void onError(Throwable e) {
Log.e("doss", "Throwable=" + e.getMessage());
}
@Override
public void onComplete() {
}
});
// new Thread(new Runnable() {
// @Override
// public void run() {
// Log.e("whh0914", "开始屏幕截图...");
// String filepath = context.getFileStreamPath("screenshot").getAbsolutePath();
// try {
// CmdUtil.execute("screencap -p " + filepath);
// } catch (Exception e) {
// Log.e("whh0914", "屏幕截图出现异常:" + e.toString());
// }
// }
// }).start();
}
/**
* 执行命令但不关注结果输出
*/
public static int execRootCmdSilent(String cmd) {
int result = -1;
DataOutputStream dos = null;
try {
Process p = Runtime.getRuntime().exec("su");
dos = new DataOutputStream(p.getOutputStream());
dos.writeBytes(cmd + "\n");
dos.flush();
dos.writeBytes("exit\n");
dos.flush();
p.waitFor();
result = p.exitValue();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
public static String getAndroiodScreenProperty(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getRealMetrics(dm);
int width = dm.widthPixels; // 屏幕宽度(像素)
int height = dm.heightPixels; // 屏幕高度(像素)
float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = dm.densityDpi; // 屏幕密度dpi(120 / 160 / 240)
// 屏幕宽度算法:屏幕宽度(像素)/屏幕密度
int screenWidth = (int) (width / density); // 屏幕宽度(dp)
int screenHeight = (int) (height / density);// 屏幕高度(dp)
Log.e("getAndroiodScreenProperty", "屏幕宽度(像素):" + width);
Log.e("getAndroiodScreenProperty", "屏幕高度(像素):" + height);
Log.e("getAndroiodScreenProperty", "屏幕密度(0.75 / 1.0 / 1.5):" + density);
Log.e("getAndroiodScreenProperty", "屏幕密度dpi(120 / 160 / 240):" + densityDpi);
Log.e("getAndroiodScreenProperty", "屏幕宽度(dp):" + screenWidth);
Log.e("getAndroiodScreenProperty", "屏幕高度(dp):" + screenHeight);
return width + "×" + height;
}
public static int getDensityDpi(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getRealMetrics(dm);
return dm.densityDpi;
}
public static String getMacAddress() {
List<NetworkInterface> interfaces = null;
try {
interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface networkInterface : interfaces) {
if (networkInterface != null && !TextUtils.isEmpty(networkInterface.getName())) {
if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
byte[] macBytes = networkInterface.getHardwareAddress();
if (macBytes != null && macBytes.length > 0) {
StringBuilder str = new StringBuilder();
for (byte b : macBytes) {
str.append(String.format("%02X:", b));
}
if (str.length() > 0) {
str.deleteCharAt(str.length() - 1);
}
return str.toString();
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "unknown";
}
@SuppressLint("HardwareIds")
public static String getIMEI(Context context, int slotIndex) {
String imei;
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imei = tm.getImei(slotIndex);
} else {
imei = tm.getDeviceId(slotIndex);
}
if (TextUtils.isEmpty(imei)) {
return context.getString(R.string.no_data);
}
return imei;
}
@SuppressLint("HardwareIds")
public static String getIMEI(Context context) {
String IMEI = "unknow";
//获取手机设备号
TelephonyManager TelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//8.0及以后版本获取
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
IMEI = TelephonyMgr.getDeviceId();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// try {
// Method method = TelephonyMgr.getClass().getMethod("getImei");
// IMEI = (String) method.invoke(TelephonyMgr);
// } catch (Exception e) {
// e.printStackTrace();
// Log.e("getIMEI", e.getMessage());
// }
// IMEI = TelephonyMgr.getDeviceId();
// } else {//9.0到10.0获取
IMEI = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}
Log.e("IMEI:", "IMEI: " + IMEI);
if (null == IMEI) {
return "";
} else {
return IMEI.toUpperCase();
}
}
/**
* IMEI 1号
*
* @param context
* @return
*/
// public static String getIMEI_1(Context context) {
// TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
// return tm != null ? tm.getDeviceId() : "";
// }
/**
* IMEI 2号
*
* @param context
* @return
*/
// public static String getIMEI_2(Context context) {
// TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
// Class clazz = tm.getClass();
// try {
// Method getImei = clazz.getDeclaredMethod("getImei", int.class);
// return getImei.invoke(tm, 1).toString();
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// }
// return "";
// }
public static String getMachine(Context context) {
String device = Build.MODEL;//机型
String imei = getIMEI(context);
String system_version = Build.VERSION.RELEASE;
String firmware_version = getRomVersion();
String rom = Utils.getCustomVersion();
String screen_rate = getAndroiodScreenProperty(context);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("device", device);
jsonObject.addProperty("imei", imei);
jsonObject.addProperty("system_version", system_version);
jsonObject.addProperty("firmware_version", firmware_version);
jsonObject.addProperty("rom", rom);
jsonObject.addProperty("screen_rate", screen_rate);
jsonObject.addProperty("working_time", SystemClock.elapsedRealtime() / 1000);
jsonObject.addProperty("restart_count", (int) SPUtils.get(context, "restart_count", 0));
jsonObject.addProperty("storage_usable", getDataTotalSizeGb(context));
jsonObject.addProperty("storage_total", getDataTotalSizeGb(context));
String jsonString = jsonObject.toString();
Log.e(TAG, "getMachine: " + jsonString);
return jsonString;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static String getHardware(Context context) {
int electric = getBattery(context);
int charging = getIsCharging(context);
String memory = Formatter.formatFileSize(context, getFreeMemory(context)) + "\t 已用" + "/" + "共" + Formatter.formatFileSize(context, getTotalMemory(context));
Log.e("getHardware", "Memory: " + memory);
String storage = getRemnantSize(context) + "/" + getDataTotalSize(context);
int CPU = getNumCores();
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("electric", electric);
jsonObject.addProperty("charging", charging);
jsonObject.addProperty("memory", memory);
jsonObject.addProperty("memory_used", Utils.getSizeGb(getFreeMemory(context)));
jsonObject.addProperty("memory_total", Utils.getSizeGb(getTotalMemory(context)));
jsonObject.addProperty("storage", storage);
jsonObject.addProperty("battery_capacity", Utils.getBatterymAh(context));
jsonObject.addProperty("CPU", CPU + "核");
String jsonString = jsonObject.toString();
Log.e(TAG, "getHardware: " + jsonString);
return jsonString;
}
public static String getAddressJsonString(Context context) {
String address = String.valueOf(SPUtils.get(context, "MapAddress", "-"));
if ("-".equals(address)) {
address = "定位失败";
}
String longitude = String.valueOf(SPUtils.get(context, "longitude", "0"));
String latitude = String.valueOf(SPUtils.get(context, "latitude", "0"));
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("address", address);
jsonObject.addProperty("longitude", longitude);
jsonObject.addProperty("latitude", latitude);
String jsonString = jsonObject.toString();
Log.e(TAG, "getAddressJsonString: " + jsonString);
return jsonString;
}
public static String getOtherInfo() {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("push_id", PushServiceFactory.getCloudPushService().getDeviceId());
String jsonString = jsonObject.toString();
Log.e(TAG, "getOtherInfo: push_id = " + jsonString);
return jsonString;
}
private static int getNumCores() {
// Private Class to display only CPU devices in the directory listing
class CpuFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
// Check if filename is "cpu", followed by a single digit number
if (Pattern.matches("cpu[0-9]", pathname.getName())) {
return true;
}
return false;
}
}
try {
// Get directory containing CPU info
File dir = new File("/sys/devices/system/cpu/");
// Filter to only list the devices we care about
File[] files = dir.listFiles(new CpuFilter());
// Return the number of cores (virtual CPU devices)
return files.length;
} catch (Exception e) {
// Default to return 1 core
return 1;
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static int getBattery(Context context) {
try {
BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
if (batteryManager == null) {
return 0;
}
int capacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
// -1 表示设备无法获取电量(无电池或底层未上报),归一到 0 避免下游误判
if (capacity < 0 || capacity > 100) {
return 0;
}
return capacity;
} catch (Exception e) {
Log.e("getBattery", "getBattery" + e.getMessage());
}
return 0;
}
/**
* 获取电池容量
*
* @param context
* @return
*/
public static double getBatterymAh(Context context) {
Object mPowerProfile;
double batteryCapacity = 0; //电池的容量mAh
final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";
try {
mPowerProfile = Class.forName(POWER_PROFILE_CLASS).getConstructor(Context.class).newInstance(context);
batteryCapacity = (double) Class.forName(POWER_PROFILE_CLASS).getMethod("getBatteryCapacity").invoke(mPowerProfile);
Log.e("getBattery", "battery mAh: " + batteryCapacity);
} catch (Exception e) {
Log.e("getBattery", "get batteryCapacity mAh error:" + batteryCapacity);
e.printStackTrace();
}
return batteryCapacity;
}
/**
* 获取电量
*
* @param mContext
* @return
*/
private static int getBatteryLevel(Context mContext) {
if (Build.VERSION.SDK_INT >= 21) {
return ((BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE)).getIntProperty(4);
} else {
Intent intent = (new ContextWrapper(mContext)).registerReceiver(null, new IntentFilter("android.intent.action.BATTERY_CHANGED"));
return intent.getIntExtra("level", -1) * 100 / intent.getIntExtra("scale", -1);
}
}
public static int getBatteryPercentage(Context context) {
IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, iFilter);
int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;
float batteryPct = level / (float) scale;
return (int) (batteryPct * 100);
}
public static int getIsCharging(Context context) {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
// int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
// boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
// boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
if (isCharging) {
return 1;
} else {
return 0;
}
}
/**
* 描述:获取可用内存.
*
* @param context
* @return
*/
public static long getAvailMemory(Context context) {
// 获取android当前可用内存大小
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
// 当前系统可用内存 ,将获得的内存大小规格化
return memoryInfo.availMem;
}
/**
* @param context
* @return 可用的内存大小
*/
public static long getFreeMemory(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long freeMem = memoryInfo.totalMem - memoryInfo.availMem;
// Log.e("getHardware", "getFreeMemory: " + freeMem);
return freeMem;
}
/**
* @param context
* @return
*/
public static long getTotalMemory(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
// Log.e("getHardware", "getFreeMemory: " + memoryInfo.totalMem);
return memoryInfo.totalMem;
}
/**
* 描述:总内存.
* https://blog.csdn.net/a357339414/article/details/52057507
*
* @return
*/
public static long getTotalMemory() {
// 系统内存信息文件
String file = "/proc/meminfo";
String memInfo;
String[] strs;
long memory = 0;
try {
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader, 8192);
// 读取meminfo第一行,系统内存大小
memInfo = bufferedReader.readLine();
strs = memInfo.split("\\s+");
// for (String str : strs) {
// L.d(AppUtil.class, str + "\t");
// }
// 获得系统总内存,单位KB
memory = Integer.valueOf(strs[1]).intValue();
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
// Byte转位KB或MB
return memory * 1024;
// return memory * 1000;
}
public static String formatFileSize(long fileS) {
DecimalFormat df = new DecimalFormat("#.0");
String fileSizeString = "";
String wrongSize = "0B";
if (fileS == 0) {
return wrongSize;
}
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "KB";
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + "MB";
} else {
fileSizeString = df.format((double) fileS / 1073741824) + "GB";
}
return fileSizeString;
}
public static void queryStorage() {
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 18(JELLY_BEAN_MR2)引入
long totalSize = statFs.getTotalBytes();
long availableSize = statFs.getAvailableBytes();
Log.e("statfs", "total = " + getUnit(totalSize));
Log.e("statfs", "availableSize = " + getUnit(availableSize));
//这里可以看出 available 是小于 free ,free 包括保留块。
Log.e("statfs", "total = " + getUnit(blockSize * blockCount));
Log.e("statfs", "available = " + getUnit(blockSize * availableCount));
Log.e("statfs", "free = " + getUnit(blockSize * freeBlocks));
}
private static String[] units = {"B", "KB", "MB", "GB", "TB"};
/**
* 单位转换
*/
private static String getUnit(float size) {
int index = 0;
while (size > 1024 && index < 4) {
size = size / 1024;
index++;
}
return String.format(Locale.getDefault(), " %.2f %s", size, units[index]);
}
public static String getSizeGb(long size) {
DecimalFormat df = new DecimalFormat("#.00");
return df.format((double) size / 1073741824);
}
public static String getDataTotalSizeGb(Context context) {
StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath());
long blockSize = sf.getBlockSize();
long totalBlocks = sf.getBlockCount();
return getSizeGb(blockSize * totalBlocks);
}
public static String getRemnantSizeGb(Context context) {
StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath());
long availableSize = sf.getAvailableBytes();
return getSizeGb(availableSize);
}
public static String getDataTotalSize(Context context) {
StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath());
long blockSize = sf.getBlockSize();
long totalBlocks = sf.getBlockCount();
return Formatter.formatFileSize(context, blockSize * totalBlocks);
}
public static String getRemnantSize(Context context) {
StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath());
long availableSize = sf.getAvailableBytes();
return Formatter.formatFileSize(context, availableSize);
}
/**
* 获取自定义版本号 或者版本号
*
* @return
*/
public static String getCustomVersion() {
if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.ZhanruiPlatform
// || JgyUtils.getInstance().checkAppPlatform() == JgyUtils.CubePlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.MTKPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.MTK11Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.TeclastP20sPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.AH6016Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.ZR6016Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.HRAD13Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.G10PPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.C2Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.YXPD1Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.G11Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.MT8768Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.AUDG104Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.HL500Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.G11JPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.P50Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.seewoPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.U1302Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.MT6765Platform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.G128TPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.QualcommTPlatform
|| JgyUtils.getInstance().checkAppPlatform() == JgyUtils.DX11Platform
) {
return Utils.getProperty("ro.build.display.id", "获取失败");
} else {
return Utils.getProperty("ro.custom.build.version", "获取失败");
}
}
/**
* 获取系统版本号
*
* @return
*/
public static String getRomVersion() {
if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.ZhanruiPlatform) {
return getProperty("ro.build.id", "获取失败");
}
// else if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.CubePlatform) {
// return Utils.getProperty("ro.build.id", "获取失败");
// }
else if (JgyUtils.getInstance().checkAppPlatform() == JgyUtils.MTKPlatform) {
return Utils.getProperty("ro.build.id", "获取失败");
} else {
return getProperty("ro.build.display.id", "获取失败");
}
}
/**
* 获取本机IP
*
* @param context
* @return
*/
public static String getIPAddress(Context context) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);//获取系统的连接服务
NetworkInfo mActiveNetInfo = mConnectivityManager.getActiveNetworkInfo();//获取网络连接的信息
NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if ((info.getType() == ConnectivityManager.TYPE_MOBILE) || (info.getType() == ConnectivityManager.TYPE_WIFI)) {//当前使用2G/3G/4G网络
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
} else { //当前无网络连接,请在设置中打开网络
return "网络未连接";
}
return "获取失败";
}
/**
* 获取WiFi信号强度
*
* @param context
* @return
*/
public static int obtainWifiInfo(Context context) {
// Wifi的连接速度及信号强度:
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
// WifiInfo wifiInfo = wifiManager.getConnectionInfo();
WifiInfo info = wifiManager.getConnectionInfo();
if (info.getBSSID() != null) {
// 链接信号强度
int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
// 链接速度
int speed = info.getLinkSpeed();
// 链接速度单位
String units = WifiInfo.LINK_SPEED_UNITS;
// Wifi源名称
String ssid = info.getSSID();
int RSSI = info.getRssi();
return RSSI;
} else {
return 0;
}
}
public static boolean isWifiAvailable(Context context) {
ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo.State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
if (NetworkInfo.State.CONNECTED == wifi) {
return true;
} else {
return false;
}
}
public static String getWifiAlias(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSSID() == null) {
return "WiFi未连接";
} else {
Log.e(TAG, "getWifiAlias: " + wifiInfo.getSSID());
return wifiInfo.getSSID();
}
}
public static String getBluetoothList(Context context) {
BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
// 获取所有通过 GATT 连接的设备(适用于低功耗蓝牙 BLE)
List<BluetoothDevice> connectedDevices = bluetoothManager.getConnectedDevices(BluetoothProfile.GATT);
for (BluetoothDevice device : connectedDevices) {
String deviceName = device.getName(); // 获取设备名称
String deviceAddress = device.getAddress(); // 获取 MAC 地址
Log.e("getBluetoothList", "已连接设备: " + deviceName + "(" + deviceAddress + ")");
}
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
return "没有蓝牙设备";
} else {
Log.e(TAG, "getBluetoothList: getName = " + bluetoothAdapter.getName());
//判断蓝牙设备是否已开起
if (!bluetoothAdapter.isEnabled()) {
return "蓝牙未开启";
// //开起蓝牙设备
// Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// context.startActivity(intent);
} else {
Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
StringBuilder stringBuilder = new StringBuilder();
for (Iterator<BluetoothDevice> iterator = devices.iterator(); iterator.hasNext(); ) {
BluetoothDevice device = iterator.next();
if (device.isConnected()) {
stringBuilder.append(device.getAlias()).append(";");
}
}
Log.e(TAG, "getConnectedBluetoothList: " + stringBuilder.toString());
return stringBuilder.toString();
}
}
}
/**
* 当前充电电流 mA
* <p>
* adb shell "cat /sys/class/power_supply/battery/BatteryAverageCurrent"
*/
public static int getCurrentChargingCurrent() {
int result = 0;
BufferedReader br = null;
try {
String line;
br = new BufferedReader(new FileReader("/sys/class/power_supply/battery/BatteryAverageCurrent"));
if ((line = br.readLine()) != null) {
result = Integer.parseInt(line);
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 当前充电电压 uV
* <p>
* adb shell "cat /sys/class/power_supply/battery/batt_vol"
*/
public static int getCurrentChargingVoltage() {
int result = 0;
BufferedReader br = null;
try {
String line;
br = new BufferedReader(new FileReader("/sys/class/power_supply/battery/batt_vol"));
if ((line = br.readLine()) != null) {
result = Integer.parseInt(line);
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
public static String getCacheDir(Context context) {
String cachePath;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
if (context.getExternalCacheDir() != null) {
cachePath = context.getExternalCacheDir().getPath();
} else if (context.getExternalFilesDir("cache") != null) {
cachePath = context.getExternalFilesDir("cache").getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}
}