From b4e1d2c06f59dd3d0b2295a41fad68e9a8ec31be Mon Sep 17 00:00:00 2001 From: jieyao Date: Mon, 31 Oct 2022 11:51:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E6=9C=80=E5=90=8E=E9=87=87=E5=8F=96=E7=9A=84?= =?UTF-8?q?=E6=98=AF=E9=9A=90=E8=97=8F=E7=8A=B6=E6=80=81=E6=A0=8F=EF=BC=8C?= =?UTF-8?q?=E9=80=8F=E6=98=8E=E7=8A=B6=E6=80=81=E6=A0=8F=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E5=9C=A8=E9=A1=B5=E9=9D=A2=E4=B8=AD=E8=B0=83=E6=95=B4=E5=B8=83?= =?UTF-8?q?=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 1 + .../business/activity/MainActivity.java | 8 +- .../business/utils/LocalAddressUtil.java | 20 ++ .../chaoran/business/utils/StatusBarUtil.java | 218 ++++++++++++++++++ 5 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/chaoran/business/utils/StatusBarUtil.java diff --git a/app/build.gradle b/app/build.gradle index 9601473..0ac67eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,4 +68,5 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.preference:preference:1.1.1' //implementation fileTree(include: ['*.aar'], dir: 'libs') + api 'com.readystatesoftware.systembartint:systembartint:1.0.3' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c881ca1..bfae48b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" + android:fitsSystemWindows="true" android:name=".application.InitApplication" android:theme="@style/Theme.PdaWeb" android:usesCleartextTraffic="true"> diff --git a/app/src/main/java/chaoran/business/activity/MainActivity.java b/app/src/main/java/chaoran/business/activity/MainActivity.java index 477dfb1..3b7b901 100644 --- a/app/src/main/java/chaoran/business/activity/MainActivity.java +++ b/app/src/main/java/chaoran/business/activity/MainActivity.java @@ -31,6 +31,7 @@ import chaoran.business.engine.SettingEngine; import chaoran.business.engine.impl.TekVoiceEngine; import chaoran.business.engine.VoiceEngine; import chaoran.business.utils.LocalAddressUtil; +import chaoran.business.utils.StatusBarUtil; /** * 流程:联网认证设备型号,验证通过,查找设备品牌进行调用驱动操作 @@ -90,6 +91,10 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ webView.setWebViewClient(disposeView()); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); + +// StatusBarUtil.transparencyBar( this); // 设置全部透明,需要在页面设置一个参数进行布局的样式跳转,不同的手机端,状态栏高度不一样(apk设置状态栏高度无效,这个是安卓9的一个bug),所以在此采取隐藏状态栏 + StatusBarUtil.hideStatusBar( this); // 设置全部透明 + //设置接口进行windows暴露 settings.setDomStorageEnabled(true); //语音引擎 @@ -98,7 +103,7 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ webView.addJavascriptInterface(settingEngine, "NetworkSettingEngine"); //重新加载页面 webView.addJavascriptInterface(this, "View"); - webView.addJavascriptInterface(new LocalAddressUtil(), "Localpda"); + webView.addJavascriptInterface(new LocalAddressUtil(this), "Localpda"); webView.loadUrl(url()); } @@ -281,4 +286,5 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ } } }; + } \ No newline at end of file diff --git a/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java b/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java index fa7f296..963ac4b 100644 --- a/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java +++ b/app/src/main/java/chaoran/business/utils/LocalAddressUtil.java @@ -2,6 +2,7 @@ package chaoran.business.utils; import android.annotation.SuppressLint; import android.bluetooth.le.ScanSettings; +import android.content.Context; import android.os.Build; import android.util.Log; import android.webkit.JavascriptInterface; @@ -13,6 +14,16 @@ import java.net.SocketException; import java.util.Enumeration; public class LocalAddressUtil { + + private Context context; + + private int[] heights; + + public LocalAddressUtil(Context context) { + this.context = context; + this.heights = StatusBarUtil.getStatusBarHeight(context); + } + @SuppressLint("JavascriptInterface") @JavascriptInterface public String getIpAddress() { @@ -77,6 +88,15 @@ public class LocalAddressUtil { return info; } + public String getHeight(int type) { + String info = ""; + switch (type) { + case 1 : info = String.valueOf(this.heights[0]); break; + case 2 : info = String.valueOf(this.heights[1]); break; + } + return info; + } + public void test(){ Log.e("test", "MANUFACTURER=" + Build.MANUFACTURER); Log.e("test", "BRAND=" + Build.BRAND); diff --git a/app/src/main/java/chaoran/business/utils/StatusBarUtil.java b/app/src/main/java/chaoran/business/utils/StatusBarUtil.java new file mode 100644 index 0000000..f9e4532 --- /dev/null +++ b/app/src/main/java/chaoran/business/utils/StatusBarUtil.java @@ -0,0 +1,218 @@ +package chaoran.business.utils; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import com.readystatesoftware.systembartint.SystemBarTintManager; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * 状态栏工具类 + */ +public class StatusBarUtil { + /** + * 修改状态栏为全透明 + * + * @param activity + */ + @TargetApi(19) + public static void transparencyBar(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window window = activity.getWindow(); + window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + /** + * 获取屏幕的高度和状态栏高度 + * @param context + * @return 第一个是屏幕,第二个是状态栏 + */ + public static int[] getStatusBarHeight(Context context) { + int[] result = new int[]{0,0}; + int resourceld = context.getResources().getIdentifier( + "status_bar_height", "dimen", "android" + ); + if (resourceld > 0) { + result[0] = context.getResources().getDisplayMetrics().heightPixels; + result[1] = context.getResources().getDimensionPixelSize(resourceld); + System.out.println( " 屏幕高度:: 状态栏高度:: " + result); + } + return result; + } + + //隐藏状态栏 + public static void hideStatusBar(Activity activity){ + if (Build.VERSION.SDK_INT >= 21) { + activity.getWindow() + .setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + } + + /** + * 修改状态栏颜色,支持4.4以上版本 + * + * @param activity + * @param colorId + */ + public static void setStatusBarColor(Activity activity, int colorId) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.setStatusBarColor(activity.getResources().getColor(colorId)); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明 + transparencyBar(activity); + SystemBarTintManager tintManager = new SystemBarTintManager(activity); + tintManager.setStatusBarTintEnabled(true); + tintManager.setStatusBarTintResource(colorId); + } + } + + /** + * 状态栏亮色模式,设置状态栏黑色文字、图标, + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android + * + * @param activity + * @return 1:MIUUI 2:Flyme 3:android6.0 + */ + public static int StatusBarLightMode(Activity activity) { + int result = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (MIUISetStatusBarLightMode(activity, true)) { + result = 1; + } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) { + result = 2; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + result = 3; + } + } + return result; + } + + /** + * 已知系统类型时,设置状态栏黑色文字、图标。 + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android + * + * @param activity + * @param type 1:MIUUI 2:Flyme 3:android6.0 + */ + public static void StatusBarLightMode(Activity activity, int type) { + if (type == 1) { + MIUISetStatusBarLightMode(activity, true); + } else if (type == 2) { + FlymeSetStatusBarLightMode(activity.getWindow(), true); + } else if (type == 3) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + + } + + /** + * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标 + */ + public static void StatusBarDarkMode(Activity activity, int type) { + if (type == 1) { + MIUISetStatusBarLightMode(activity, false); + } else if (type == 2) { + FlymeSetStatusBarLightMode(activity.getWindow(), false); + } else if (type == 3) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + } + + + /** + * 设置状态栏图标为深色和魅族特定的文字风格 + * 可以用来判断是否为Flyme用户 + * + * @param window 需要设置的窗口 + * @param dark 是否把状态栏文字及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { + boolean result = false; + if (window != null) { + try { + WindowManager.LayoutParams lp = window.getAttributes(); + Field darkFlag = WindowManager.LayoutParams.class + .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class + .getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(lp); + if (dark) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(lp, value); + window.setAttributes(lp); + result = true; + } catch (Exception e) { + + } + } + return result; + } + + /** + * 需要MIUIV6以上 + * + * @param activity + * @param dark 是否把状态栏文字及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) { + boolean result = false; + Window window = activity.getWindow(); + if (window != null) { + Class clazz = window.getClass(); + try { + int darkModeFlag = 0; + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + if (dark) { + extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 + } else { + extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 + } + result = true; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上 + if (dark) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } else { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + } + } catch (Exception e) { + } + } + return result; + } +} \ No newline at end of file