RNScreenpxModule 安卓的桥接模块,
用来判断机型是否是全面屏
以及是否开启了全面屏,
通过这个模块, 来适配一些RN中安卓全画幅的UI高度

package com.regan.ebankhome;import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.os.Build;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;import androidx.core.content.ContextCompat;import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;import java.util.HashMap;
import java.util.Map;public class RNScreenpxModule extends ReactContextBaseJavaModule {private int w = 0; // 当前设备的宽度方向 像素数private int h = 0; // 当前设备的宽度方向 像素数private volatile static boolean mHasCheckAllScreen;private volatile static boolean mIsAllScreenDevice;   // 是否全面屏private volatile static boolean notNavigationBarExist; // 不存在虚拟导航器 (即真正的使用全面屏)public RNScreenpxModule(ReactApplicationContext reactApplicationContext) {super(reactApplicationContext);WindowManager wd = (WindowManager) reactApplicationContext.getSystemService(Context.WINDOW_SERVICE);// 1. 获取当前安卓设备的真实像素w = RNScreenpxModule.getRealPXFromScreenW(reactApplicationContext);h = RNScreenpxModule.getRealPXFromScreenH(reactApplicationContext);// 2. 判断是否为全面屏mIsAllScreenDevice = RNScreenpxModule.isAllScreenDevice(reactApplicationContext);Log.e("ssss", mIsAllScreenDevice + "===0=== 全面屏吗??????");if (mIsAllScreenDevice) {Log.e("ssss", notNavigationBarExist + "===0=== 开启了吗??????");notNavigationBarExist = Settings.Global.getInt(reactApplicationContext.getContentResolver(), "force_fsg_nav_bar", 0) != 0;Log.e("ssss", notNavigationBarExist + "===0=== 开启了吗??????");}}/*** 获取当前安卓设备的真实像素** @param context*/public static int getRealPXFromScreenH(Context context) {WindowManager wd = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display defaultDisplay = wd.getDefaultDisplay();Point point = new Point();defaultDisplay.getSize(point);int x = point.x;int y = point.y;return y;}/*** 获取当前安卓设备的真实像素** @param context*/public static int getRealPXFromScreenW(Context context) {WindowManager wd = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display defaultDisplay = wd.getDefaultDisplay();Point point = new Point();defaultDisplay.getSize(point);int x = point.x;int y = point.y;return x;}/*** 判断 安卓设置是否 全面屏** @param context* @return*/public static boolean isAllScreenDevice(Context context) {if (mHasCheckAllScreen) {return mIsAllScreenDevice;}mHasCheckAllScreen = true;mIsAllScreenDevice = false;// 低于 API 21的,都不会是全面屏。。。if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {return false;}WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);if (windowManager != null) {Display display = windowManager.getDefaultDisplay();Point point = new Point();display.getRealSize(point);float width, height;if (point.x < point.y) {width = point.x;height = point.y;} else {width = point.y;height = point.x;}if (height / width >= 1.97f) {mIsAllScreenDevice = true;}}return mIsAllScreenDevice;}/*** 这是定义JS端要调用的模块名,比如"ScreenpxModule"** @return*/@Overridepublic String getName() {return "ScreenpxModule";}/*** 获取屏幕宽度方向像素* 这是用作导出一个方法给JavaScript使用,Java方法需要使用注解@ReactMethod* 所以到时候JS调用就是React.NativeModules.ScreenpxModule.getScreenW().then()...** @param promise*/@ReactMethodpublic void getScreenW(Promise promise) {promise.resolve(w);}@ReactMethodpublic void getScreenH(Promise promise) {promise.resolve(h);}@ReactMethodpublic void checkFullScreen(Promise promise) {Boolean fullScreenAndNotNavigationBarExist = mIsAllScreenDevice && notNavigationBarExist;// 全面屏切启用了全面屏if (fullScreenAndNotNavigationBarExist) {promise.resolve(true);} else {// 非全面屏或 全面屏但是未启用全面屏功能promise.resolve(false);}}}

使用

  componentDidMount() {!isiOS() ? LocalStoreUtils.isUseFullScreen_Android('get').then((res) => {this.setState({chooseViewheight: res ? app.screenH : app.height});}) : null;}
export const height = Dimensions.get("window").height;
export const screenH = Dimensions.get("screen").height;

RN- 判断安卓是否是全面屏及是否开启了全面屏相关推荐

  1. 自动打开html网页脚本,开启网页全屏插件(自动开启网页全屏脚本js插件)

    开启网页全屏插件(自动开启网页全屏脚本js插件)是由作者陈鹏杰分享的一个浏览器扩展插件.通过本脚本,用户在网页加载完4秒后,启动网页全屏.非常简单方便快捷! 脚本描述: 在以下网页开启网页全屏 b 站 ...

  2. 如何判断安卓模拟器的型号(品牌)

    看到这个标题,可能很多人会疑惑,为啥?判断安卓模拟器本身就不一定准确,更何况还要知道它是什么品牌? 是蓝叠.腾讯手游助手.网易Mumu还是夜神模拟器呢? 先谈如何识别模拟器,百度.谷歌搜索,能找到不少 ...

  3. 安卓应用间的数据共享:ContentProvider、ContentResolver全解

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓应用间的数据共享:ContentProvider.ContentResolver全解 ContentProvider用于应用程序向系统公开数据,C ...

  4. 安卓android_rom定制,移植,安卓Android_ROM定制、移植:第一~~八篇(全)

    安卓Android_ROM定制.移植:第一~~八篇(全)把那八篇收费奇高的文章整理了一下,同时也给自己挣点银子 想写点关于安卓ROM的一些教程,也许教程和网上一些类似,不过绝对是我自己的理解以及实战教 ...

  5. H5页面判断安卓苹果

    H5页面判断安卓苹果 $(function(){var u = navigator.userAgent, app = navigator.appVersion;var isAndroid = u.in ...

  6. RN项目安卓真机调试步骤

    RN项目安卓真机调试步骤 1.adb(Android Debug Bridge)工具安装: 打开终端,入当前用户的home目录,默认就是,不是的话执行命令:cd ~ 或 cd /Users/YourM ...

  7. 判断浏览器是手机端还是pc端 以及判断安卓还是iOS

    // 方法一 function IsPC() {var userAgentInfo = navigator.userAgent; var Agents = ["Android", ...

  8. 为什么java退出全屏_Java全屏模式与退出全屏:

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 浏览器全屏模式的启动函数requestFullscreen(),而且需要附带各浏览器的js方言前缀. Js代码: // 启动全屏!判断浏览器的种类 fun ...

  9. python全栈要学什么_python全栈要学什么 python全栈学习路线

    IT行业,技术要比学历.年龄.从业经验更为重要,技术水平直接决定就业薪资,想要学好python,首先要先了解精通Python语言基础.Python web开发.Python爬虫.Python数据分析这 ...

最新文章

  1. 计算机视觉技术 图像分类_如何训练图像分类器并教您的计算机日语
  2. PacBio Sequel概述
  3. Linux 中的进程管理
  4. pythontemp_python 临时文件夹 的 tempfile模块学习
  5. css动画-模拟正余弦曲线
  6. mysql 磁盘限额_Linux运维知识之为Linux MySQL数据库设置磁盘限额
  7. 如何构建一个简单的语音识别应用程序
  8. android 底部黑边,android – 截屏周围的黑色边缘
  9. 李飞飞CVPR最新论文 | 「文本转图」效果优化可多一步:物体关系描述
  10. C# string 转 bool
  11. Android for opencv(1)android使用opencv基本操作:读写 图片,操作像素等
  12. cad插件_CAD插件燕秀工具箱2.81
  13. C# 抖音无水印视频下载教程,教你你如何抓取抖音无水印接口
  14. 【量子机器学习】HHL算法: Quantum algorithm for solving linear systems of equations
  15. 【记录】在Windows上使用MinGW.Thread.h等文件测试C++11多线程;及异常解方:error To use the MinGW-std-threads library;
  16. matlab 使用fprintf打印度数符号
  17. AUTOCAD——中心线绘制、CAD默认线宽是多少?可以修改吗?
  18. python提取电子发票_Python办公自动化—电子发票台账制作自动化(3)
  19. Oracle select表要带双引号的原因
  20. [简单逆向]某直播APP 收费直播链接获取-AES解密

热门文章

  1. 英文论文摘要写法心得
  2. linux系统字符设备文件类型,Linux文件类型
  3. Weisfeiler-Lehman算法测试图同构
  4. LinuxC语言开发工具
  5. 愿每一个人的创造力都能被激发:剪映Mac版来了!
  6. ES5和ES6继承的区别
  7. 本地mac配置ssh免密登录远程linux服务器
  8. EHF数据集简介(SMPL-X)
  9. 自监督论文阅读笔记 Barlow Twins: Self-Supervised Learning via Redundancy Reduction
  10. c# mysql executenonquery_c#数据四种执行方法(ExecuteNonQuery)