package com.yidianling.common.tools; import android.app.Activity; import android.app.KeyguardManager; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Rect; 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.util.DisplayMetrics; import android.util.Log; import android.view.Surface; import android.view.View; import android.view.WindowManager; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.lang.reflect.Method; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * 设备工具类 * Created by vondear on 2016/1/24. */ public class RxDeviceTool { /** * 得到屏幕的高 * * @param context * @return */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int height = wm.getDefaultDisplay().getHeight(); return height; } /** * 获取应用区域高度 * (说明这里的context 一定要是activity的context 否则类型转换失败) * * @param context * @return */ public static int getAppHeight(Context context) { if (null == context) { return 0; } /** * 获取应用区域高度 */ Rect outRect1 = new Rect(); try { ((Activity) context).getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1); } catch (ClassCastException e) { e.printStackTrace(); return 0; } int activityHeight = outRect1.height(); return activityHeight; } /** * 获取状态栏高度 * * @return */ public static int getStatusBarHeight(Context context) { int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; } public static String getIP(Context context){ 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().toString(); } } } } catch (SocketException ex){ ex.printStackTrace(); } return null; } /** * 得到屏幕的宽 * * @param context * @return */ public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); return width; } /** * 得到设备屏幕的宽度 */ public static int getScreenWidths(Context context) { return context.getResources().getDisplayMetrics().widthPixels; } /** * 得到设备屏幕的高度 */ public static int getScreenHeights(Context context) { return context.getResources().getDisplayMetrics().heightPixels; } /** * 得到设备的密度 */ public static float getScreenDensity(Context context) { return context.getResources().getDisplayMetrics().density; } /** * 获取手机唯一标识序列号 * * @return */ public static String getUniqueSerialNumber() { String phoneName = Build.MODEL;// Galaxy nexus 品牌类型 String manuFacturer = Build.MANUFACTURER;//samsung 品牌 Log.d("详细序列号", manuFacturer + "-" + phoneName + "-" + getSerialNumber()); return manuFacturer + "-" + phoneName + "-" + getSerialNumber(); } /** * 获取android系统版本号 */ public static String getOsBuileVersion(){ return Build.VERSION.RELEASE; } /** * 获取ISO标准的国家码,即国际长途区号 * * @param context * @return */ public static String getNetworkCountryIso(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getNetworkCountryIso(); } /** * 获取设备的 MCC + MNC * * @param context * @return */ public static String getNetworkOperator(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getNetworkOperator(); } /** * 获取(当前已注册的用户)的名字 * * @param context * @return */ public static String getNetworkOperatorName(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getNetworkOperatorName(); } /** * 获取当前使用的网络类型 * * @param context * @return */ public static int getNetworkType(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getNetworkType(); } /** * 获取手机类型 * * @param context * @return */ public static int getPhoneType(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getPhoneType(); } /** * 获取SIM卡的国家码 * * @param context * @return */ public static String getSimCountryIso(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSimCountryIso(); } /** * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字 * * @param context * @return */ public static String getSimOperator(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSimOperator(); } /** * 获取服务商名称 * * @param context * @return */ public static String getSimOperatorName(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSimOperatorName(); } /** * 获取SIM的状态信息 * * @param context * @return */ public static int getSimState(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSimState(); } /** * 获取设备型号,如MI2SC * * @return 设备型号 */ public static String getBuildBrandModel() { return Build.MODEL;// Galaxy nexus 品牌类型 } public static String getBuildBrand() { return Build.BRAND;//google } /** * 获取设备厂商,如Xiaomi * * @return 设备厂商 */ public static String getBuildMANUFACTURER() { return Build.MANUFACTURER;// samsung 品牌 } /** * 序列号 * * @return */ public static String getSerialNumber() { String serial = null; try { 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(); } return serial; } /** * 获取App版本名称 * * @param context * @return */ public static String getAppVersionName(Context context) { // 获取packagemanager的实例 PackageManager packageManager = context.getPackageManager(); // getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = null; try { packInfo = packageManager.getPackageInfo(context.getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } if (packInfo==null){ return ""; } return packInfo.versionName; } /** * 获取App版本号 * * @param context * @return */ public static int getAppVersionNo(Context context) { // 获取packagemanager的实例 PackageManager packageManager = context.getPackageManager(); // getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = null; try { packInfo = packageManager.getPackageInfo(context.getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } int version = packInfo.versionCode; return version; } /** * 检查权限 * * @param context * @param permission 例如 Manifest.permission.READ_PHONE_STATE * @return */ public static boolean checkPermission(Context context, String permission) { boolean result = false; if (Build.VERSION.SDK_INT >= 23) { try { Class clazz = Class.forName("android.content.Context"); Method method = clazz.getMethod("checkSelfPermission", String.class); int rest = (Integer) method.invoke(context, permission); result = rest == PackageManager.PERMISSION_GRANTED; } catch (Exception e) { result = false; } } else { PackageManager pm = context.getPackageManager(); if (pm.checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) { result = true; } } return result; } /** * 遍历LOG输出HashMap * * @param res */ public static void ThroughArray(HashMap res) { Iterator ite = res.entrySet().iterator(); while (ite.hasNext()) { Map.Entry entry = (Map.Entry) ite.next(); Object key = entry.getKey(); Object value = entry.getValue(); Log.d("MSG_AUTH_COMPLETE", (key + ": " + value)); } } /** * 获取设备MAC地址 * <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> * * @param context 上下文 * @return MAC地址 */ public static String getMacAddress(Context context) { WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); if (info != null) { String macAddress = info.getMacAddress(); if (macAddress != null) { return macAddress.replace(":", ""); } } return null; } /** * 获取设备MAC地址 * <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> * * @return MAC地址 */ public static String getMacAddress() { String macAddress = null; LineNumberReader lnr = null; InputStreamReader isr = null; try { Process pp = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address"); isr = new InputStreamReader(pp.getInputStream()); lnr = new LineNumberReader(isr); macAddress = lnr.readLine().replace(":", ""); } catch (IOException e) { e.printStackTrace(); } finally { RxFileTool.closeIO(lnr, isr); } return macAddress == null ? "" : macAddress; } /** * 判断设备是否是手机 * * @param context 上下文 * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean isPhone(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE; } /** * 获取手机状态信息 * <p>需添加权限 {@code <uses-permission android:name="android.permission.READ_PHONE_STATE"/>}</p> * * @param context 上下文 * @return DeviceId(IMEI) = 99000311726612<br> * DeviceSoftwareVersion = 00<br> * Line1Number =<br> * NetworkCountryIso = cn<br> * NetworkOperator = 46003<br> * NetworkOperatorName = 中国电信<br> * NetworkType = 6<br> * honeType = 2<br> * SimCountryIso = cn<br> * SimOperator = 46003<br> * SimOperatorName = 中国电信<br> * SimSerialNumber = 89860315045710604022<br> * SimState = 5<br> * SubscriberId(IMSI) = 460030419724900<br> * VoiceMailNumber = *86<br> */ public static String getPhoneStatus(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String str = ""; str += "NetworkCountryIso = " + tm.getNetworkCountryIso() + "\n"; str += "NetworkOperator = " + tm.getNetworkOperator() + "\n"; str += "NetworkOperatorName = " + tm.getNetworkOperatorName() + "\n"; str += "NetworkType = " + tm.getNetworkType() + "\n"; str += "honeType = " + tm.getPhoneType() + "\n"; str += "SimCountryIso = " + tm.getSimCountryIso() + "\n"; str += "SimOperator = " + tm.getSimOperator() + "\n"; str += "SimOperatorName = " + tm.getSimOperatorName() + "\n"; str += "SimState = " + tm.getSimState() + "\n"; return str; } /** * 跳至填充好phoneNumber的拨号界面 * * @param context 上下文 * @param phoneNumber 电话号码 */ public static void dial(Context context, String phoneNumber) { context.startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber))); } /** * 设置屏幕为横屏 * <p>还有一种就是在Activity中加属性android:screenOrientation="landscape"</p> * <p>不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次</p> * <p>设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次</p> * <p>设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"(4.0以上必须带最后一个参数)时 * 切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法</p> * * @param activity activity */ public static void setLandscape(Activity activity) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } /** * 设置屏幕为竖屏 * * @param activity activity */ public static void setPortrait(Activity activity) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } /** * 判断是否横屏 * * @param context 上下文 * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean isLandscape(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } /** * 判断是否竖屏 * * @param context 上下文 * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean isPortrait(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; } /** * 获取屏幕旋转角度 * * @param activity activity * @return 屏幕旋转角度 */ public static int getScreenRotation(Activity activity) { switch (activity.getWindowManager().getDefaultDisplay().getRotation()) { default: case Surface.ROTATION_0: return 0; case Surface.ROTATION_90: return 90; case Surface.ROTATION_180: return 180; case Surface.ROTATION_270: return 270; } } /** * 获取当前屏幕截图,包含状态栏 * * @param activity activity * @return Bitmap */ public static Bitmap captureWithStatusBar(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bmp = view.getDrawingCache(); int width = getScreenWidth(activity); int height = getScreenHeight(activity); Bitmap ret = Bitmap.createBitmap(bmp, 0, 0, width, height); view.destroyDrawingCache(); return ret; } /** * 获取当前屏幕截图,不包含状态栏 * <p>需要用到上面获取状态栏高度getStatusBarHeight的方法</p> * * @param activity activity * @return Bitmap */ public static Bitmap captureWithoutStatusBar(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bmp = view.getDrawingCache(); int statusBarHeight = RxBarTool.getStatusBarHeight(activity); int width = getScreenWidth(activity); int height = getScreenHeight(activity); Bitmap ret = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return ret; } /** * 获取DisplayMetrics对象 * * @param context 应用程序上下文 * @return */ public static DisplayMetrics getDisplayMetrics(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics displayMetrics = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics; } /** * 判断是否锁屏 * * @param context 上下文 * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean isScreenLock(Context context) { KeyguardManager km = (KeyguardManager) context .getSystemService(Context.KEYGUARD_SERVICE); return km.inKeyguardRestrictedInputMode(); } /** * 设置安全窗口,禁用系统截屏。防止 App 中的一些界面被截屏,并显示在其他设备中造成信息泄漏。 * (常见手机设备系统截屏操作方式为:同时按下电源键和音量键。) * * @param activity */ public static void noScreenshots(Activity activity) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } /** * Return the version name of device's system. * * @return the version name of device's system */ public static String getSDKVersionName() { return android.os.Build.VERSION.RELEASE; } }