package com.skyseraph.xknife.lib.utils.android; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.os.PowerManager; import android.provider.Settings; import android.telephony.TelephonyManager; import com.skyseraph.xknife.lib.utils.nomal.ShellUtils; import java.io.File; import java.net.NetworkInterface; import java.security.MessageDigest; import java.util.Collections; import java.util.List; /** * Created by Bob on 2015/2/2. */ public class DeviceUtils { private DeviceUtils() { throw new AssertionError(); } /** * 获取Phone IMEI * * @param cxt the cxt * @return the phone imei */ public static String getPhoneIMEI(Context cxt) { TelephonyManager tm = (TelephonyManager) cxt .getSystemService(Context.TELEPHONY_SERVICE); return tm.getDeviceId(); } /** * 获取Android系统版本 * * @return the system version */ public static String getSystemVersion() { return android.os.Build.VERSION.RELEASE; } /** * 获取Android SDK版本 * * @return the sdk version */ @TargetApi(Build.VERSION_CODES.DONUT) public static int getSDKVersion() { return android.os.Build.VERSION.SDK_INT; } /** * 获取AndroidID * * @param context the context * @return the android id */ @SuppressLint("HardwareIds") public static String getAndroidID(Context context) { return context == null ? null : (Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)); } /** * 获取设备厂商 * * @return the manufacturer */ public static String getManufacturer() { return Build.MANUFACTURER; } /** * 获取设备型号 * * @return the model */ public static String getModel() { String model = Build.MODEL; if (model != null) { model = model.trim().replaceAll("\\s*", ""); } else { model = ""; } return model; } /** * 获取当前App的版本号 * * @param context the context * @return the app version code */ public static int getAppVersionCode(Context context) { int version = 0; try { version = context.getPackageManager().getPackageInfo( context.getPackageName(), 0).versionCode; } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException(DeviceUtils.class.getName() + "the application not found"); } return version; } /** * 获取App签名 * * @param context the context * @param pkgName the pkg name * @return the app sign */ public static String getAppSign(Context context, String pkgName) { try { PackageInfo pis = context.getPackageManager().getPackageInfo( pkgName, PackageManager.GET_SIGNATURES); return hexdigest(pis.signatures[0].toByteArray()); } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException(DeviceUtils.class.getName() + "the " + pkgName + "'s application not found"); } } /** * 将签名字符串转换成需要的32位签名 */ private static String hexdigest(byte[] paramArrayOfByte) { final char[] hexDigits = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; try { MessageDigest localMessageDigest = MessageDigest.getInstance("MD5"); localMessageDigest.update(paramArrayOfByte); byte[] arrayOfByte = localMessageDigest.digest(); char[] arrayOfChar = new char[32]; for (int i = 0, j = 0; ; i++, j++) { if (i >= 16) { return new String(arrayOfChar); } int k = arrayOfByte[i]; arrayOfChar[j] = hexDigits[(0xF & k >>> 4)]; arrayOfChar[++j] = hexDigits[(k & 0xF)]; } } catch (Exception e) { } return ""; } /** * 判断设备是否root * * @return the boolean */ public static boolean isDeviceRooted() { String su = "su"; String[] locations = {"/system/bin/", "/system/xbin/", "/sbin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/xbin/", "/data/local/bin/", "/data/local/"}; for (String location : locations) { if (new File(location + su).exists()) { return true; } } return false; } /** * 获取设备MAC地址 * <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> * <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> */ private final static String DEFAULT_MAC_ADDR = "02:00:00:00:00:00"; /** * Gets mac address. * * @param context the context * @return the mac address */ public static String getMacAddress(Context context) { String macAddress = getMacAddressByWifiInfo(context); if (!DEFAULT_MAC_ADDR.equals(macAddress)) { return macAddress; } macAddress = getMacAddressByNetworkInterface(); if (!DEFAULT_MAC_ADDR.equals(macAddress)) { return macAddress; } macAddress = getMacAddressByFile(); if (!DEFAULT_MAC_ADDR.equals(macAddress)) { return macAddress; } return "please open wifi"; } /** * 获取设备MAC地址 * <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> */ @SuppressLint("HardwareIds") private static String getMacAddressByWifiInfo(Context context) { if (context == null) { return DEFAULT_MAC_ADDR; } try { WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if (wifi != null) { WifiInfo info = wifi.getConnectionInfo(); if (info != null) return info.getMacAddress(); } } catch (Exception e) { e.printStackTrace(); } return DEFAULT_MAC_ADDR; } /** * 获取设备MAC地址 * <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> */ private static String getMacAddressByNetworkInterface() { try { List<NetworkInterface> nis = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface ni : nis) { if (!ni.getName().equalsIgnoreCase("wlan0")) continue; byte[] macBytes = ni.getHardwareAddress(); if (macBytes != null && macBytes.length > 0) { StringBuilder res1 = new StringBuilder(); for (byte b : macBytes) { res1.append(String.format("%02x:", b)); } return res1.deleteCharAt(res1.length() - 1).toString(); } } } catch (Exception e) { e.printStackTrace(); } return "02:00:00:00:00:00"; } /** * 获取设备MAC地址 */ private static String getMacAddressByFile() { ShellUtils.CommandResult result = ShellUtils.execCmd("getprop wifi.interface", false); if (result.result == 0) { String name = result.successMsg; if (name != null) { result = ShellUtils.execCmd("cat /sys/class/net/" + name + "/address", false); if (result.result == 0) { if (result.successMsg != null) { return result.successMsg; } } } } return "02:00:00:00:00:00"; } /** * 关机 * <p>需要root权限或者系统权限 {@code <android:sharedUserId="android.uid.system"/>}</p> * * @param context the context */ public static void shutdown(Context context) { ShellUtils.execCmd("reboot -p", true); Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN"); intent.putExtra("android.intent.extra.KEY_CONFIRM", false); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (context != null) { context.startActivity(intent); } } /** * 重启 * <p>需要root权限或者系统权限 {@code <android:sharedUserId="android.uid.system"/>}</p> * * @param context the context */ public static void reboot(Context context) { ShellUtils.execCmd("reboot", true); Intent intent = new Intent(Intent.ACTION_REBOOT); intent.putExtra("nowait", 1); intent.putExtra("interval", 1); intent.putExtra("window", 0); if (context != null) { context.sendBroadcast(intent); } } /** * 重启 * <p>需系统权限 {@code <android:sharedUserId="android.uid.system"/>}</p> * * @param context the context * @param reason 传递给内核来请求特殊的引导模式,如"recovery" */ public static void reboot(Context context, String reason) { if (context != null) { PowerManager mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); try { mPowerManager.reboot(reason); } catch (Exception e) { e.printStackTrace(); } } } /** * 重启到recovery * <p>需要root权限</p> */ public static void reboot2Recovery() { ShellUtils.execCmd("reboot recovery", true); } /** * 重启到bootloader * <p>需要root权限</p> */ public static void reboot2Bootloader() { ShellUtils.execCmd("reboot bootloader", true); } }