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(); } /** * IMEI (唯一标识序列号) * <p>需与{@link #isPhone(Context)}一起使用</p> * <p>需添加权限 {@code <uses-permission android:name="android.permission.READ_PHONE_STATE"/>}</p> * * @param context 上下文 * @return IMEI */ // public static String getIMEI(Context context) { // String deviceId; // if (isPhone(context)) { // deviceId = getDeviceIdIMEI(context); // } else { // deviceId = getAndroidId(context); // } // return deviceId; // } /** * 获取设备的IMSI * * @param context * @return */ // public static String getIMSI(Context context) { // return getSubscriberId(context); // } /** * 获取设备的IMEI * * @param context * @return */ // public static String getDeviceIdIMEI(Context context) { // String id; // //android.telephony.TelephonyManager // TelephonyManager mTelephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // if (mTelephony.getDeviceId() != null) { // id = mTelephony.getDeviceId(); // } else { // //android.provider.Settings; // id = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); // } // return id; // } /** * 获取设备的软件版本号 * * @param context * @return */ // public static String getDeviceSoftwareVersion(Context context) { // TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // return tm.getDeviceSoftwareVersion(); // } /** * 获取android系统版本号 */ public static String getOsBuileVersion(){ return Build.VERSION.RELEASE; } /** * 获取手机号 * * @param context * @return */ // public static String getLine1Number(Context context) { // TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // return tm.getLine1Number(); // } /** * 获取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 String getSimSerialNumber(Context context) { // TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // return tm.getSimSerialNumber(); // } /** * 获取SIM的状态信息 * * @param context * @return */ public static int getSimState(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSimState(); } /** * 获取唯一的用户ID * * @param context * @return */ // public static String getSubscriberId(Context context) { // TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // return tm.getSubscriberId(); // } /** * 获取语音邮件号码 * * @param context * @return */ // public static String getVoiceMailNumber(Context context) { // TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // return tm.getVoiceMailNumber(); // } /** * 获取ANDROID ID * * @param context * @return */ public static String getAndroidId(Context context) { return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); } /** * 获取设备型号,如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; } /** * 获取设备信息 * * @param context * @return */ // public static String getDeviceInfo(Context context) { // try { // org.json.JSONObject json = new org.json.JSONObject(); // TelephonyManager tm = (TelephonyManager) context // .getSystemService(Context.TELEPHONY_SERVICE); // String device_id = null; // if (checkPermission(context, Manifest.permission.READ_PHONE_STATE)) { // device_id = getDeviceIdIMEI(context); // } // String mac = null; // FileReader fstream = null; // try { // fstream = new FileReader("/sys/class/net/wlan0/address"); // } catch (FileNotFoundException e) { // fstream = new FileReader("/sys/class/net/eth0/address"); // } // BufferedReader in = null; // if (fstream != null) { // try { // in = new BufferedReader(fstream, 1024); // mac = in.readLine(); // } catch (IOException e) { // } finally { // if (fstream != null) { // try { // fstream.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } // if (in != null) { // try { // in.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } // } // } // json.put("mac", mac); // if (TextUtils.isEmpty(device_id)) { // device_id = mac; // } // if (TextUtils.isEmpty(device_id)) { // device_id = Settings.Secure.getString(context.getContentResolver(), // Settings.Secure.ANDROID_ID); // } // json.put("device_id", device_id); // return json.toString(); // } catch (Exception e) { // e.printStackTrace(); // } // return null; // } /** * 遍历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 += "DeviceId(IMEI) = " + getDeviceIdIMEI(context) + "\n"; // str += "DeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion() + "\n"; // str += "Line1Number = " + tm.getLine1Number() + "\n"; 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 += "SimSerialNumber = " + tm.getSimSerialNumber() + "\n"; str += "SimState = " + tm.getSimState() + "\n"; // str += "SubscriberId(IMSI) = " + tm.getSubscriberId() + "\n"; // str += "VoiceMailNumber = " + tm.getVoiceMailNumber() + "\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>需添加权限 {@code <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>}</p> * <p>需添加权限 {@code <uses-permission android:name="android.permission.READ_CONTACTS"/>}</p> * * @param context 上下文; * @return 联系人链表 */ // public static List<HashMap<String, String>> getAllContactInfo(Context context) { // SystemClock.sleep(3000); // ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); // // 1.获取内容解析者 // ContentResolver resolver = context.getContentResolver(); // // 2.获取内容提供者的地址:com.android.contacts // // raw_contacts表的地址 :raw_contacts // // view_data表的地址 : data // // 3.生成查询地址 // Uri raw_uri = Uri.parse("content://com.android.contacts/raw_contacts"); // Uri date_uri = Uri.parse("content://com.android.contacts/data"); // // 4.查询操作,先查询raw_contacts,查询contact_id // // projection : 查询的字段 // Cursor cursor = resolver.query(raw_uri, new String[]{"contact_id"}, // null, null, null); // // 5.解析cursor // while (cursor.moveToNext()) { // // 6.获取查询的数据 // String contact_id = cursor.getString(0); // // cursor.getString(cursor.getColumnIndex("contact_id"));//getColumnIndex // // : 查询字段在cursor中索引值,一般都是用在查询字段比较多的时候 // // 判断contact_id是否为空 // if (!RxDataTool.isNullString(contact_id)) {//null "" // // 7.根据contact_id查询view_data表中的数据 // // selection : 查询条件 // // selectionArgs :查询条件的参数 // // sortOrder : 排序 // // 空指针: 1.null.方法 2.参数为null // Cursor c = resolver.query(date_uri, new String[]{"data1", // "mimetype"}, "raw_contact_id=?", // new String[]{contact_id}, null); // HashMap<String, String> map = new HashMap<String, String>(); // // 8.解析c // while (c.moveToNext()) { // // 9.获取数据 // String data1 = c.getString(0); // String mimetype = c.getString(1); // // 10.根据类型去判断获取的data1数据并保存 // if (mimetype.equals("vnd.android.cursor.item/phone_v2")) { // // 电话 // map.put("phone", data1); // } else if (mimetype.equals("vnd.android.cursor.item/name")) { // // 姓名 // map.put("name", data1); // } // } // // 11.添加到集合中数据 // list.add(map); // // 12.关闭cursor // c.close(); // } // } // // 12.关闭cursor // cursor.close(); // return list; // } /** * 打开手机联系人界面点击联系人后便获取该号码 * <p>参照以下注释代码</p> */ public static void getContantNum() { Log.i("tips", "U should copy the following code."); /* Intent intent = new Intent(); intent.setAction("android.intent.action.PICK"); intent.setType("vnd.android.cursor.dir/phone_v2"); startActivityForResult(intent, 0); @Override protected void onActivityResult ( int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); if (data != null) { Uri uri = data.getData(); String num = null; // 创建内容解析者 ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { num = cursor.getString(cursor.getColumnIndex("data1")); } cursor.close(); num = num.replaceAll("-", "");//替换的操作,555-6 -> 5556 } } */ } /** * 获取手机短信并保存到xml中 * <p>需添加权限 {@code <uses-permission android:name="android.permission.READ_SMS"/>}</p> * <p>需添加权限 {@code <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>}</p> * * @param context 上下文 */ // public static void getAllSMS(Context context) { // // 1.获取短信 // // 1.1获取内容解析者 // ContentResolver resolver = context.getContentResolver(); // // 1.2获取内容提供者地址 sms,sms表的地址:null 不写 // // 1.3获取查询路径 // Uri uri = Uri.parse("content://sms"); // // 1.4.查询操作 // // projection : 查询的字段 // // selection : 查询的条件 // // selectionArgs : 查询条件的参数 // // sortOrder : 排序 // Cursor cursor = resolver.query(uri, new String[]{"address", "date", "type", "body"}, null, null, null); // // 设置最大进度 // int count = cursor.getCount();//获取短信的个数 // // 2.备份短信 // // 2.1获取xml序列器 // XmlSerializer xmlSerializer = Xml.newSerializer(); // try { // // 2.2设置xml文件保存的路径 // // os : 保存的位置 // // encoding : 编码格式 // xmlSerializer.setOutput(new FileOutputStream(new File("/mnt/sdcard/backupsms.xml")), "utf-8"); // // 2.3设置头信息 // // standalone : 是否独立保存 // xmlSerializer.startDocument("utf-8", true); // // 2.4设置根标签 // xmlSerializer.startTag(null, "smss"); // // 1.5.解析cursor // while (cursor.moveToNext()) { // SystemClock.sleep(1000); // // 2.5设置短信的标签 // xmlSerializer.startTag(null, "sms"); // // 2.6设置文本内容的标签 // xmlSerializer.startTag(null, "address"); // String address = cursor.getString(0); // // 2.7设置文本内容 // xmlSerializer.text(address); // xmlSerializer.endTag(null, "address"); // xmlSerializer.startTag(null, "date"); // String date = cursor.getString(1); // xmlSerializer.text(date); // xmlSerializer.endTag(null, "date"); // xmlSerializer.startTag(null, "type"); // String type = cursor.getString(2); // xmlSerializer.text(type); // xmlSerializer.endTag(null, "type"); // xmlSerializer.startTag(null, "body"); // String body = cursor.getString(3); // xmlSerializer.text(body); // xmlSerializer.endTag(null, "body"); // xmlSerializer.endTag(null, "sms"); // System.out.println("address:" + address + " date:" + date + " type:" + type + " body:" + body); // } // xmlSerializer.endTag(null, "smss"); // xmlSerializer.endDocument(); // // 2.8将数据刷新到文件中 // xmlSerializer.flush(); // } catch (Exception e) { // e.printStackTrace(); // } // } /** * 设置屏幕为横屏 * <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; } }