package com.ydl.ydlcommon.utils; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; 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.Build; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import com.tbruyelle.rxpermissions2.RxPermissions; import com.yidianling.common.tools.RxTool; import com.ydl.ydlcommon.BuildConfig; import java.io.BufferedReader; import java.io.FileReader; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.Reader; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Collections; import java.util.Enumeration; import java.util.List; import static com.umeng.socialize.utils.ContextUtil.getPackageName; public class DeviceTool { public static void openPersisonSetting(Activity activity) { String brand = Build.BRAND;//手机厂商 if (TextUtils.equals(brand.toLowerCase(), "redmi") || TextUtils.equals(brand.toLowerCase(), "xiaomi")) { gotoMiuiPermission(activity);//小米 } else if (TextUtils.equals(brand.toLowerCase(), "meizu")) { gotoMeizuPermission(activity); } else { activity.startActivity(getAppDetailSettingIntent()); } gotoMiuiPermission(activity); } /** * 跳转到miui的权限管理页面 */ private static void gotoMiuiPermission(Activity activity) { Intent i = new Intent("miui.intent.action.APP_PERM_EDITOR"); ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity"); i.setComponent(componentName); i.putExtra("extra_pkgname", getPackageName()); try { activity.startActivity(i); } catch (Exception e) { e.printStackTrace(); gotoMeizuPermission(activity); } } /** * 获取应用详情页面intent * * @return */ private static Intent getAppDetailSettingIntent() { Intent localIntent = new Intent(); localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); localIntent.setData(Uri.fromParts("package", getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= 8) { localIntent.setAction(Intent.ACTION_VIEW); localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName()); } return localIntent; } /** * 跳转到魅族的权限管理系统 */ private static void gotoMeizuPermission(Activity activity) { Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); try { activity.startActivity(intent); } catch (Exception e) { e.printStackTrace(); activity.startActivity(getAppDetailSettingIntent()); } } //获取虚拟按键栏高度 public static int getNavigationBarHeight(Context context) { int result = 0; //是否纯在虚拟按键栏(导航栏) Resources res = context.getResources(); int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { result = res.getDimensionPixelSize(resourceId); } return result; } /** * 获取手机IMEI * * @return */ @SuppressLint("MissingPermission") public static final String getIMEI() { Activity topTaskActivity = ActivityManager.Companion.getInstance().getTopTaskActivity(); try { String imei = ""; RxPermissions rxPermissions = new RxPermissions(topTaskActivity); if (rxPermissions.isGranted(Manifest.permission.READ_PHONE_STATE)) { //实例化TelephonyManager对象 TelephonyManager telephonyManager = (TelephonyManager) topTaskActivity.getSystemService(Context.TELEPHONY_SERVICE); if (null == telephonyManager){ return ""; } //获取IMEI号 imei = telephonyManager.getDeviceId(); if (imei == null) { return ""; } } return RxTool.Md5(imei); } catch (Exception e) { e.printStackTrace(); return ""; } } public static String getEncryptionAndroidID() { try { @SuppressLint("HardwareIds") String id = Settings.Secure.getString( RxTool.getContext().getContentResolver(), Settings.Secure.ANDROID_ID ); return TextUtils.isEmpty(id) ? "" : id; } catch (Exception e) { return ""; } } public static String getAndroidID() { try { @SuppressLint("HardwareIds") String id = Settings.Secure.getString( RxTool.getContext().getContentResolver(), Settings.Secure.ANDROID_ID ); return TextUtils.isEmpty(id) ? "" : RxTool.Md5(id); } catch (Exception e) { return ""; } } //没有网络连接 public static final int NETWORN_NONE = 0; //wifi连接 public static final int NETWORN_WIFI = 100; //手机网络数据连接类型 public static final int NETWORN_2G = 2; public static final int NETWORN_3G = 3; public static final int NETWORN_4G = 4; public static final int NETWORN_MOBILE = 1; /** * 获取当前网络连接类型 * * @param context * @return */ public static int getNetworkState(Context context) { //获取系统的网络服务 ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //如果当前没有网络 if (null == connManager) return NETWORN_NONE; //获取当前网络类型,如果为空,返回无网络 NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo(); if (activeNetInfo == null || !activeNetInfo.isAvailable()) { return NETWORN_NONE; } // 判断是不是连接的是不是wifi NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (null != wifiInfo) { NetworkInfo.State state = wifiInfo.getState(); if (null != state) if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) { return NETWORN_WIFI; } } // 如果不是wifi,则判断当前连接的是运营商的哪种网络2g、3g、4g等 NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (null != networkInfo) { NetworkInfo.State state = networkInfo.getState(); String strSubTypeName = networkInfo.getSubtypeName(); if (null != state) if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) { switch (activeNetInfo.getSubtype()) { //如果是2g类型 case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: return NETWORN_2G; //如果是3g类型 case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: case TelephonyManager.NETWORK_TYPE_HSPAP: return NETWORN_3G; //如果是4g类型 case TelephonyManager.NETWORK_TYPE_LTE: return NETWORN_4G; default: //中国移动 联通 电信 三种3G制式 if (strSubTypeName.equalsIgnoreCase("TD-SCDMA") || strSubTypeName.equalsIgnoreCase("WCDMA") || strSubTypeName.equalsIgnoreCase("CDMA2000")) { return NETWORN_3G; } else { return NETWORN_MOBILE; } } } } return NETWORN_NONE; } public static String getMac(Context context) { String strMac = null; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { strMac = getLocalMacAddressFromWifiInfo(context); return strMac; } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { strMac = getMacAddress(context); return strMac; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (!TextUtils.isEmpty(getMacAddress())) { strMac = getMacAddress(); return strMac; } else if (!TextUtils.isEmpty(getMachineHardwareAddress())) { strMac = getMachineHardwareAddress(); return strMac; } else { strMac = getLocalMacAddressFromBusybox(); return strMac; } } return "02:00:00:00:00:00"; } /* * 获取MAC地址 *GPRS链接和WIFI链接返回同一个MAC地址 * */ public 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(); 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 e) { e.printStackTrace(); } return "02:00:00:00:00:00"; } /** * * 将ip的整数形式转换成ip形式 * * @param ipInt * @return */ public static String int2ip(int ipInt) { StringBuilder sb = new StringBuilder(); sb.append(ipInt & 0xFF).append("."); sb.append((ipInt >> 8) & 0xFF).append("."); sb.append((ipInt >> 16) & 0xFF).append("."); sb.append((ipInt >> 24) & 0xFF); return sb.toString(); } /** * 获取WIFI当前ip地址 * * @param context * @return */ public static String getLocalWifiIpAddress(Context context) { try { WifiManager wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int i = wifiInfo.getIpAddress(); return int2ip(i); } catch (Exception ex) { return " 获取IP出错鸟!!!!请保证是WIFI,或者请重新打开网络!\n" + ex.getMessage(); } // return null; } //GPRS连接下的ip public static String getLocalGPRSIpAddress() { 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()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e("WifiPreferenceIpAddress", ex.toString()); } return null; } /** * 通过网络接口取MAC地址 * @return */ public static String getNewMac() { 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 null; } 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) { ex.printStackTrace(); } return null; } public static String getLocalMacAddressFromWifiInfo(Context context) { WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo winfo = wifi.getConnectionInfo(); String mac = winfo.getMacAddress(); return mac; } /* * 获取IPV6地址 * */ public static String getLocalIpV6() { 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(); // logger.error("ip1 " + inetAddress); /* logger.error("getHostName " + inetAddress.getHostName()); logger.error("getCanonicalHostName " + inetAddress.getCanonicalHostName()); logger.error("getAddress " + Arrays.toString(inetAddress.getAddress())); logger.error("getHostAddress " + inetAddress.getHostAddress());*/ if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet6Address) { return inetAddress.getHostAddress(); } } } } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; } public static String getMacAddress(Context context) { // 如果是6.0以下,直接通过wifimanager获取 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { String macAddress0 = getMacAddress0(context); if (!TextUtils.isEmpty(macAddress0)) { return macAddress0; } } 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) { Log.e("----->" + "NetInfoManager", "getMacAddress:" + ex.toString()); } if (macSerial == null || "".equals(macSerial)) { try { return loadFileAsString("/sys/class/net/eth0/address") .toUpperCase().substring(0, 17); } catch (Exception e) { e.printStackTrace(); Log.e("----->" + "NetInfoManager", "getMacAddress:" + e.toString()); } } return macSerial; } private static String getMacAddress0(Context context) { if (isAccessWifiStateAuthorized(context)) { WifiManager wifiMgr = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = null; try { wifiInfo = wifiMgr.getConnectionInfo(); return wifiInfo.getMacAddress(); } catch (Exception e) { Log.e("----->" + "NetInfoManager", "getMacAddress0:" + e.toString()); } } return ""; } /** * Check whether accessing wifi state is permitted * * @param context * @return */ private static boolean isAccessWifiStateAuthorized(Context context) { if (PackageManager.PERMISSION_GRANTED == context .checkCallingOrSelfPermission("android.permission.ACCESS_WIFI_STATE")) { Log.e("----->" + "NetInfoManager", "isAccessWifiStateAuthorized:" + "access wifi state is enabled"); return true; } else return false; } private static String loadFileAsString(String fileName) throws Exception { FileReader reader = new FileReader(fileName); String text = loadReaderAsString(reader); reader.close(); return text; } private 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(); } /** * 根据IP地址获取MAC地址 * * @return */ public static String getMacAddress() { String strMacAddr = null; try { // 获得IpD地址 InetAddress ip = getLocalInetAddress(); byte[] b = NetworkInterface.getByInetAddress(ip) .getHardwareAddress(); StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; i++) { if (i != 0) { buffer.append(':'); } String str = Integer.toHexString(b[i] & 0xFF); buffer.append(str.length() == 1 ? 0 + str : str); } strMacAddr = buffer.toString().toUpperCase(); } catch (Exception e) { } return strMacAddr; } /** * 获取移动设备本地IP * * @return */ private static InetAddress getLocalInetAddress() { InetAddress ip = null; try { // 列举 Enumeration<NetworkInterface> en_netInterface = NetworkInterface .getNetworkInterfaces(); while (en_netInterface.hasMoreElements()) {// 是否还有元素 NetworkInterface ni = (NetworkInterface) en_netInterface .nextElement();// 得到下一个元素 Enumeration<InetAddress> en_ip = ni.getInetAddresses();// 得到一个ip地址的列举 while (en_ip.hasMoreElements()) { ip = en_ip.nextElement(); if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) break; else ip = null; } if (ip != null) { break; } } } catch (SocketException e) { e.printStackTrace(); } return ip; } /** * 获取本地IP * * @return */ public static String getLocalIpAddress() { 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()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { ex.printStackTrace(); } return null; } public static String getMachineHardwareAddress() { Enumeration<NetworkInterface> interfaces = null; try { interfaces = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { e.printStackTrace(); } String hardWareAddress = null; NetworkInterface iF = null; if (interfaces == null) { return null; } while (interfaces.hasMoreElements()) { iF = interfaces.nextElement(); try { hardWareAddress = bytesToString(iF.getHardwareAddress()); if (hardWareAddress != null) break; } catch (SocketException e) { e.printStackTrace(); } } return hardWareAddress; } /*** * byte转为String * * @param bytes * @return */ private static String bytesToString(byte[] bytes) { if (bytes == null || bytes.length == 0) { return null; } StringBuilder buf = new StringBuilder(); for (byte b : bytes) { buf.append(String.format("%02X:", b)); } if (buf.length() > 0) { buf.deleteCharAt(buf.length() - 1); } return buf.toString(); } public static String getLocalMacAddressFromBusybox() { String result = ""; String Mac = ""; result = callCmd("busybox ifconfig", "HWaddr"); // 如果返回的result == null,则说明网络不可取 if (result == null) { return "网络异常"; } // 对该行数据进行解析 // 例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67 if (result.length() > 0 && result.contains("HWaddr") == true) { Mac = result.substring(result.indexOf("HWaddr") + 6, result.length() - 1); result = Mac; } return result; } private static String callCmd(String cmd, String filter) { String result = ""; String line = ""; try { Process proc = Runtime.getRuntime().exec(cmd); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(is); while ((line = br.readLine()) != null && line.contains(filter) == false) { result += line; } result = line; } catch (Exception e) { e.printStackTrace(); } return result; } }