package com.xiaomi.xms.sales.util; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.WindowManager; import com.xiaomi.xms.sales.R; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.Locale; public class Device { private static final String TAG = "device"; /** 设备宽度(像素) */ public static int DISPLAY_WIDTH; /** 设备高度(像素) */ public static int DISPLAY_HEIGHT; /** 设备的高度*设备的宽度 */ public static String DISPLAY_RESOLUTION; /** 设备的像素密度dpi */ public static int DISPLAY_DENSITY; /** 用户可见的设备名,例如Nexus One */ public static String MODEL; /** 内部设备名,例如Nexus One是passion */ public static String DEVICE; /** 产品名 */ public static String PRODUCT; /** 主板名 */ public static String BOARD; /** 硬件名,从内核命令行获取,例如qcom */ public static String HARDWARE; /** 生产商 */ public static String MANUFACTURER; /** 软件定制品牌 */ public static String BRAND; /** build类型,例如user/eng */ public static String BUILD_TYPE; /** 系统的sdk版本号 */ public static int SDK_VERSION; /** 系统的版本号(MIUI),例如2.7.13*/ public static String SYSTEM_VERSION; /** 系统的版本号(Android),例如4.0.4 */ public static String RELEASE; /** 是否MIUI系统 */ public static boolean IS_MIUI; /** 商城的package name **/ public static String PACKAGE; /** 商城的version code */ public static int SHOP_VERSION; /** 商城的version name */ public static String SHOP_VERSION_STRING; /** 商城是否系统应用 */ public static boolean IS_SYSTEM_SHOP; /** 设置中的国家 */ public static String COUNTRY; /** 设置中的语言 */ public static String LANGUAGE; /** Sim卡的运营商 */ public static String CARRIER; /** 设备号 */ public static String UUID; /** IMEI号 */ public static String IMEI; /** 渠道号 */ public static String CHANNEL_ID; /** 是否为新安装用户 **/ public static boolean IS_NEW_USER; private static final String KEY_INSTALL_TIME = "installTime"; private static final long NEW_USER_TIME = 7 * 24 * 60 * 60 * 1000; // 默认安装7天以内为新用户 public static void init(Context context) { acquireScreenAttr(context); acquireSystemInfo(context); acquireShopInfo(context); acquireUserInfo(context); acquireIdentity(context); acquireIsNewUser(context); } public static String getClientInfoHash() { return Coder.encodeMD5(getFullInfo()); } public static String getFullInfo() { return DISPLAY_RESOLUTION + DISPLAY_WIDTH + DISPLAY_HEIGHT + DISPLAY_DENSITY + MODEL + DEVICE + PRODUCT + BOARD + HARDWARE + MANUFACTURER + BRAND + BUILD_TYPE + SDK_VERSION + SYSTEM_VERSION + RELEASE + IS_MIUI + SHOP_VERSION + SHOP_VERSION_STRING + IS_SYSTEM_SHOP + COUNTRY + LANGUAGE + CARRIER + UUID + IMEI + CHANNEL_ID; } private static void acquireScreenAttr(Context context) { DisplayMetrics dm = new DisplayMetrics(); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(dm); DISPLAY_HEIGHT = dm.heightPixels; DISPLAY_WIDTH = dm.widthPixels; DISPLAY_RESOLUTION = DISPLAY_HEIGHT + "*" + DISPLAY_WIDTH; DISPLAY_DENSITY = dm.densityDpi; } private static void acquireSystemInfo(Context context) { MODEL = Build.MODEL; DEVICE = Build.DEVICE; PRODUCT = Build.PRODUCT; BOARD = Build.BOARD; HARDWARE = Build.HARDWARE; MANUFACTURER = Build.MANUFACTURER; BRAND = Build.BRAND; BUILD_TYPE = Build.TYPE; RELEASE = Build.VERSION.RELEASE; SYSTEM_VERSION = Build.VERSION.INCREMENTAL; SDK_VERSION = Build.VERSION.SDK_INT; IS_MIUI = isMiui(context); } private static void acquireShopInfo(Context context) { PackageManager packageManager = context.getPackageManager(); try { PackageInfo pkgInfo = packageManager.getPackageInfo(context.getPackageName(), 0); PACKAGE = pkgInfo.packageName; SHOP_VERSION = pkgInfo.versionCode; SHOP_VERSION_STRING = pkgInfo.versionName; IS_SYSTEM_SHOP = (pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } catch (NameNotFoundException e) { SHOP_VERSION = 0; SHOP_VERSION_STRING = ""; IS_SYSTEM_SHOP = false; } } private static void acquireUserInfo(Context context) { COUNTRY = Locale.getDefault().getCountry(); LANGUAGE = Locale.getDefault().getLanguage(); TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); CARRIER = telManager.getSimOperator(); } private static void acquireIdentity(Context context) { // device id if (context != null) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String deviceId = tm.getDeviceId(); if (TextUtils.isEmpty(deviceId)) { deviceId = ""; } IMEI = deviceId; // mac WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); String mac = info.getMacAddress(); StringBuffer uuid = new StringBuffer(); if (!TextUtils.isEmpty(deviceId)) { uuid.append(deviceId); } if (!TextUtils.isEmpty(mac)) { uuid.append("_"); uuid.append(mac); } UUID = Coder.encodeMD5(uuid.toString()); CHANNEL_ID = context.getString(R.string.channel_id); } } private static void acquireIsNewUser(Context context) { long installTime = Utils.Preference.getLongPref(context, KEY_INSTALL_TIME, 0); long nowTime = System.currentTimeMillis(); if (installTime <= 0 || nowTime - installTime < 0) { IS_NEW_USER = true; Utils.Preference.setLongPref(context, KEY_INSTALL_TIME, nowTime); } else if (nowTime - installTime < NEW_USER_TIME) { IS_NEW_USER = true; } else { IS_NEW_USER = false; } } /** * 通过判断CloudService是否存在来判断是否是miui,小米账户如果不存在的话认为不是miui */ private static boolean isMiui(Context context) { PackageManager packageManager = context.getPackageManager(); try { PackageInfo pkgInfo = packageManager.getPackageInfo("com.miui.cloudservice", 0); return (pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } catch (NameNotFoundException e) { e.printStackTrace(); return false; } } public static String getLocalIpAddress() { try { Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); while (en.hasMoreElements()) { NetworkInterface intf = en.nextElement(); Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); while (enumIpAddr.hasMoreElements()) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress(); } } } } catch (SocketException e) { LogUtil.e(TAG, e.toString()); } return null; } }