Android 常用Utils工具类

  1. ScreenUtils.java /屏幕相关工具类

    package com.common.utils;

    import android.app.Activity;
    import android.app.KeyguardManager;
    import android.content.Context;
    import android.content.pm.ActivityInfo;
    import android.graphics.Bitmap;
    import android.graphics.Color;
    import android.os.Build;
    import android.util.DisplayMetrics;
    import android.util.TypedValue;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.WindowManager.LayoutParams;

    import java.lang.reflect.Method;

    /**

    • @desc: 屏幕相关工具类
      */
      public class ScreenUtils {

      private ScreenUtils() {
      throw new UnsupportedOperationException(“error…”);
      }

      /**

      • 获取屏幕的宽度px
      • @param context 上下文
      • @return 屏幕宽px
        */
        public static int getScreenWidth(Context context) {
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();// 创建了一张白纸
        windowManager.getDefaultDisplay().getMetrics(outMetrics);// 给白纸设置宽高
        return outMetrics.widthPixels;
        }

      /**

      • 获取屏幕的高度px
      • @param context 上下文
      • @return 屏幕高px
        */
        public static int getScreenHeight(Context context) {
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();// 创建了一张白纸
        windowManager.getDefaultDisplay().getMetrics(outMetrics);// 给白纸设置宽高
        return outMetrics.heightPixels;
        }

      /**

      • 获取屏幕的px
      • @param activity 上下文
      • @return 屏幕高px
        */
        public static DisplayMetrics getScreenPix(Activity activity) {
        DisplayMetrics displaysMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);
        return displaysMetrics;
        }

      /**

      • 设置透明状态栏(api大于19方可使用)
      • 可在Activity的onCreat()中调用

      • 需在顶部控件布局中加入以下属性让内容出现在状态栏之下

      • android:clipToPadding="true"

      • android:fitsSystemWindows="true"

      • @param activity activity
        */
        public static void setTransparentStatusBar(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //透明状态栏
        activity.getWindow().addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //透明导航栏
        activity.getWindow().addFlags(LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        }

      /**

      • 隐藏状态栏
      • 也就是设置全屏,一定要在setContentView之前调用,否则报错

      • 此方法Activity可以继承AppCompatActivity

      • 启动的时候状态栏会显示一下再隐藏,比如QQ的欢迎界面

      • 在配置文件中Activity加属性android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

      • 如加了以上配置Activity不能继承AppCompatActivity,会报错

      • @param activity activity
        */
        public static void hideStatusBar(Activity activity) {
        activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
        activity.getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN,
        LayoutParams.FLAG_FULLSCREEN);
        }

      /**

      • 获取状态栏高度
      • @param context 上下文
      • @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;
        }

      /**

      • 判断状态栏是否存在
      • @param activity activity
      • @return {@code true}: 存在
        {@code false}: 不存在
        */
        public static boolean isStatusBarExists(Activity activity) {
        LayoutParams params = activity.getWindow().getAttributes();
        return (params.flags & LayoutParams.FLAG_FULLSCREEN) != LayoutParams.FLAG_FULLSCREEN;
        }

      /**

      • 获取ActionBar高度
      • @param activity activity
      • @return ActionBar高度
        */
        public static int getActionBarHeight(Activity activity) {
        TypedValue tv = new TypedValue();
        if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
        return TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics());
        }
        return 0;
        }

      /**

      • 显示通知栏
      • 需添加权限 {@code }

      • @param context 上下文
      • @param isSettingPanel {@code true}: 打开设置
        {@code false}: 打开通知
        */
        public static void showNotificationBar(Context context, boolean isSettingPanel) {
        String methodName = (Build.VERSION.SDK_INT <= 16) ? “expand”
        : (isSettingPanel ? “expandSettingsPanel” : “expandNotificationsPanel”);
        invokePanels(context, methodName);
        }

      /**

      • 隐藏通知栏
      • 需添加权限 {@code }

      • @param context 上下文
        */
        public static void hideNotificationBar(Context context) {
        String methodName = (Build.VERSION.SDK_INT <= 16) ? “collapse” : “collapsePanels”;
        invokePanels(context, methodName);
        }

      /**

      • 反射唤醒通知栏
      • @param context 上下文
      • @param methodName 方法名
        */
        private static void invokePanels(Context context, String methodName) {
        try {
        Object service = context.getSystemService(“statusbar”);
        Class<?> statusBarManager = Class.forName(“android.app.StatusBarManager”);
        Method expand = statusBarManager.getMethod(methodName);
        expand.invoke(service);
        } catch (Exception e) {
        e.printStackTrace();
        }
        }

      /**

      • 展开状态栏
      • @param ctx 上下文
        */
        public static void collapseStatusBar(Context ctx) {
        Object sbservice = ctx.getSystemService(“statusbar”);
        try {
        Class<?> statusBarManager = Class.forName(“android.app.StatusBarManager”);
        Method collapse;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        collapse = statusBarManager.getMethod(“collapsePanels”);
        } else {
        collapse = statusBarManager.getMethod(“collapse”);
        }
        collapse.invoke(sbservice);
        } catch (Exception e) {
        e.printStackTrace();
        }
        }

      /**

      • 收起状态栏
      • @param ctx 上下文
        */
        public static final void expandStatusBar(Context ctx) {
        Object sbservice = ctx.getSystemService(“statusbar”);
        try {
        Class<?> statusBarManager = Class.forName(“android.app.StatusBarManager”);
        Method expand;
        if (Build.VERSION.SDK_INT >= 17) {
        expand = statusBarManager.getMethod(“expandNotificationsPanel”);
        } else {
        expand = statusBarManager.getMethod(“expand”);
        }
        expand.invoke(sbservice);
        } catch (Exception e) {
        e.printStackTrace();
        }
        }

      /**

      • 设置屏幕为横屏
      • 还有一种就是在Activity中加属性android:screenOrientation="landscape"

      • 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

      • 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

      • 设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"(4.0以上必须带最后一个参数)时

      • 切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
      • @param activity activity
        */
        public static void setLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }

      /**

      • 获取当前屏幕截图,包含状态栏
      • @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 bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
        view.destroyDrawingCache();
        return bp;
        }

      /**

      • 获取当前屏幕截图,不包含状态栏
      • 需要用到上面获取状态栏高度getStatusBarHeight的方法

      • @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 = getStatusBarHeight(activity);
        int width = getScreenWidth(activity);
        int height = getScreenHeight(activity);
        Bitmap bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return bp;
        }

      /**

      • 判断是否锁屏
      • @param context 上下文
      • @return {@code true}: 是
        {@code false}: 否
        */
        public static boolean isScreenLock(Context context) {
        KeyguardManager km = (KeyguardManager) context
        .getSystemService(Context.KEYGUARD_SERVICE);
        return km.inKeyguardRestrictedInputMode();
        }

      /**

      • 状态栏透明
      • @param activity activity
        */
        public static void translateStatusBar(Activity activity)
        {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        View decorview = activity.getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorview.setSystemUiVisibility(option);
        activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        LayoutParams localLayoutParams = activity.getWindow().getAttributes();
        localLayoutParams.flags = LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags;
        }
        }

      /**

      • 获取状态栏高度

      • @param context 上下文

      • @return 状态栏高度
        /
        public static int getStatuBarHeight(Context context) {
        /
        *

        • 获取状态栏高度——方法
          */
          int statusBarHeight = -1;
          //获取status_bar_height资源的ID
          int resourceId = context.getResources().getIdentifier(“status_bar_height”, “dimen”, “android”);
          if (resourceId > 0) {
          //根据资源ID获取响应的尺寸值
          statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
          }

        return statusBarHeight;
        }
        }

  2. NetworkUtils.java 网络相关工具

    package com.common.utils;

    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.telephony.TelephonyManager;

    /**
    *

    • 1,显示连接已保存,但标题栏没有,即没有实质连接上, 输出为:not connect, available

    • 2,显示连接已保存,标题栏也有已连接上的图标, 输出为:connect, available

    • 3,选择不保存后 输出为:not connect, available

    • 4,选择连接,在正在获取IP地址时 输出为:not connect, not available

    • 5,连接上后 输出为:connect, available

    • @desc: 网络相关工具
      */
      public class NetworkUtils {

      private NetworkUtils() {
      throw new UnsupportedOperationException(“error…”);
      }

      public static final int NETWORK_WIFI = 1; // wifi network
      public static final int NETWORK_4G = 4; // “4G” networks
      public static final int NETWORK_3G = 3; // “3G” networks
      public static final int NETWORK_2G = 2; // “2G” networks
      public static final int NETWORK_UNKNOWN = 5; // unknown network
      public static final int NETWORK_NO = -1; // no network

      private static final int NETWORK_TYPE_GSM = 16;
      private static final int NETWORK_TYPE_TD_SCDMA = 17;
      private static final int NETWORK_TYPE_IWLAN = 18;

      /**

      • 打开网络设置界面
      • 3.0以下打开设置界面

      • @param context 上下文
        */
        public static void openWirelessSettings(Context context) {
        if (android.os.Build.VERSION.SDK_INT > 10) {
        context.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
        } else {
        context.startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
        }
        }

      /**

      • 判断网络是否可用(网络有效的唯一判断)
      • 需添加权限 {@code }

      • @param context 上下文
      • @return {@code true}: 可用
        {@code false}: 不可用
        */
        public static boolean isWorked(Context context) {
        return isAvailable(context) && isConnected(context);
        }

      /**

      • 获取活动网络信息
      • @param context 上下文
      • @return NetworkInfo
        */
        private static NetworkInfo getActiveNetworkInfo(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo();
        }

      /**

      • 判断网络是否可用
      • 需添加权限 {@code }

      • @param context 上下文
      • @return {@code true}: 可用
        {@code false}: 不可用
        */
        public static boolean isAvailable(Context context) {
        NetworkInfo info = getActiveNetworkInfo(context);
        return info != null && info.isAvailable();
        }

      /**

      • 判断网络是否连接
      • 需添加权限 {@code }

      • @param context 上下文
      • @return {@code true}: 是
        {@code false}: 否
        */
        public static boolean isConnected(Context context) {
        NetworkInfo info = getActiveNetworkInfo(context);
        return info != null && info.isConnected();
        }

      /**

      • 判断网络是否是4G
      • 需添加权限 {@code }

      • @param context 上下文
      • @return {@code true}: 是
        {@code false}: 不是
        */
        public static boolean is4G(Context context) {
        NetworkInfo info = getActiveNetworkInfo(context);
        return info != null && info.isAvailable() && info.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE;
        }

      /**

      • 判断wifi是否连接状态
      • 需添加权限 {@code }

      • @param context 上下文
      • @return {@code true}: 连接
        {@code false}: 未连接
        */
        public static boolean isWifiConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm != null && cm.getActiveNetworkInfo() != null
        && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;
        }

      /**

      • 获取移动网络运营商名称
      • 如中国联通、中国移动、中国电信

      • @param context 上下文
      • @return 移动网络运营商名称
        */
        public static String getNetworkOperatorName(Context context) {
        TelephonyManager tm = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
        return tm != null ? tm.getNetworkOperatorName() : null;
        }

      /**

      • 获取移动终端类型
      • @param context 上下文
      • @return 手机制式
      • {@link TelephonyManager#PHONE_TYPE_NONE } : 0 手机制式未知
    • {@link TelephonyManager#PHONE_TYPE_GSM } : 1 手机制式为GSM,移动和联通
  3. {@link TelephonyManager#PHONE_TYPE_CDMA } : 2 手机制式为CDMA,电信
  4. {@link TelephonyManager#PHONE_TYPE_SIP } : 3
  5. */
    public static int getPhoneType(Context context) {
    TelephonyManager tm = (TelephonyManager) context
    .getSystemService(Context.TELEPHONY_SERVICE);
    return tm != null ? tm.getPhoneType() : -1;
    }

    /**

    • 获取当前的网络类型(WIFI,2G,3G,4G)
    • 需添加权限 {@code }

    • @param context 上下文
    • @return 网络类型
    • {@link #NETWORK_WIFI } = 1;
    • {@link #NETWORK_4G } = 4;
    • {@link #NETWORK_3G } = 3;
    • {@link #NETWORK_2G } = 2;
    • {@link #NETWORK_UNKNOWN} = 5;
    • {@link #NETWORK_NO } = -1;

    */
    public static int getNetWorkType(Context context) {
    int netType = NETWORK_NO;
    NetworkInfo info = getActiveNetworkInfo(context);
    if (info != null && info.isAvailable()) {

         if (info.getType() == ConnectivityManager.TYPE_WIFI) {
             netType = NETWORK_WIFI;
         } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
             switch (info.getSubtype()) {
    
                 case NETWORK_TYPE_GSM:
                 case TelephonyManager.NETWORK_TYPE_GPRS:
                 case TelephonyManager.NETWORK_TYPE_CDMA:
                 case TelephonyManager.NETWORK_TYPE_EDGE:
                 case TelephonyManager.NETWORK_TYPE_1xRTT:
                 case TelephonyManager.NETWORK_TYPE_IDEN:
                     netType = NETWORK_2G;
                     break;
    
                 case NETWORK_TYPE_TD_SCDMA:
                 case TelephonyManager.NETWORK_TYPE_EVDO_A:
                 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:
                     netType = NETWORK_3G;
                     break;
    
                 case NETWORK_TYPE_IWLAN:
                 case TelephonyManager.NETWORK_TYPE_LTE:
                     netType = NETWORK_4G;
                     break;
                 default:
    
                     String subtypeName = info.getSubtypeName();
                     if (subtypeName.equalsIgnoreCase("TD-SCDMA")
                             || subtypeName.equalsIgnoreCase("WCDMA")
                             || subtypeName.equalsIgnoreCase("CDMA2000")) {
                         netType = NETWORK_3G;
                     } else {
                         netType = NETWORK_UNKNOWN;
                     }
                     break;
             }
         } else {
             netType = NETWORK_UNKNOWN;
         }
     }
     return netType;
    

    }

    /**

    • 获取当前的网络类型(WIFI,2G,3G,4G)
    • 依赖上面的方法

    • @param context 上下文
    • @return 网络类型名称
    • NETWORK_WIFI
    • NETWORK_4G
    • NETWORK_3G
    • NETWORK_2G
    • NETWORK_UNKNOWN
    • NETWORK_NO

    */
    public static String getNetWorkTypeName(Context context) {
    switch (getNetWorkType(context)) {
    case NETWORK_WIFI:
    return “NETWORK_WIFI”;
    case NETWORK_4G:
    return “NETWORK_4G”;
    case NETWORK_3G:
    return “NETWORK_3G”;
    case NETWORK_2G:
    return “NETWORK_2G”;
    case NETWORK_NO:
    return “NETWORK_NO”;
    default:
    return “NETWORK_UNKNOWN”;
    }
    }

猜你喜欢

转载自blog.csdn.net/liaochaoyun/article/details/86678610