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,移动和联通
    • {@link TelephonyManager#PHONE_TYPE_CDMA } : 2 手机制式为CDMA,电信
    • {@link TelephonyManager#PHONE_TYPE_SIP } : 3
    • */
      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”;
          }
          }

        • 1
          点赞
        • 5
          收藏
          觉得还不错? 一键收藏
        • 打赏
          打赏
        • 1
          评论
        常用Android Studio工具类有以下几个: 1. AndroidUniqueID: 这是一个用于获取Android设备唯一标识符的工具类,可以通过GitHub链接(https://github.com/appdevzhang/AndroidUniqueID)找到详细使用方法。 2. Lazy android: 这是一个方便快捷的Android工具类,通过GitHub链接(https://github.com/l123456789jy/Lazy android)可以了解它的具体功能和用法。 3. Utils-Everywhere: 这是一个Android各种工具类的集合,通过GitHub链接(https://github.com/SenhLinsh/Utils-Everywhere)可以查看所有可用的工具类和使用方法。 这些工具类都是为了方便开发者在Android Studio中进行开发而设计的,可以提高开发效率和代码质量。同时,还可以使用Lint工具来进行静态代码检查,找出代码结构和质量问题,并提供解决方案。通过Android Studio自带的Lint功能,可以进行一些常见的代码优化,去除多余的资源等。 可以通过这个(https://blog.csdn.net/ouyang_peng/article/details/80374867)链接来了解更多关于Lint工具的配置和使用方法。 除了Lint工具,还有其他的静态代码检查框架,如FindBugs、PMD和Checkstyle等,它们可以检查Java源文件或class文件的代码质量和代码风格。但在Android开发中,我们通常会选择使用Lint框架,因为它提供了强大的功能、扩展性和与Android Studio、Android Gradle插件的原生支持。此外,Lint框架还提供了许多有用的Android相关检查规则,而且有Google官方的支持,在Android开发工具的升级中也会得到完善。 你可以通过这个链接(https://blog.csdn.net/MeituanTech/article/details/79922364)了解更多关于Lint框架的使用和优势。 总结来说,Android Studio常用工具类包括AndroidUniqueID、Lazy androidUtils-Everywhere等,而Lint工具则可以帮助我们进行静态代码检查和优化。

        “相关推荐”对你有帮助么?

        • 非常没帮助
        • 没帮助
        • 一般
        • 有帮助
        • 非常有帮助
        提交
        评论 1
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包

        打赏作者

        村里小码农

        你的鼓励将是我创作的最大动力

        ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
        扫码支付:¥1
        获取中
        扫码支付

        您的余额不足,请更换扫码支付或充值

        打赏作者

        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值