-
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;
}
} - 获取状态栏高度——方法
-
-
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 networkprivate 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
- 获取当前的网络类型(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;
- 获取当前的网络类型(WIFI,2G,3G,4G)
-
依赖上面的方法
- @param context 上下文
- @return 网络类型名称
-
- NETWORK_WIFI
- NETWORK_4G
- NETWORK_3G
- NETWORK_2G
- NETWORK_UNKNOWN
- NETWORK_NO
*/
public static int getPhoneType(Context context) {
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
return tm != null ? tm.getPhoneType() : -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;
}
/**
*/
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”;
}
}