• React Native读取系统属性


    一、背景

            前段时间,公司需要用React Native做一套电视机顶盒上的视频播放系统,而其中有一项功能是需要读取到机顶盒的卡号,这个卡号提前被生产商写入了系统属性,叫“persist.sys.mmcp.smarcardid”,通过在命令行运行adb shell后,再运行getprop命令可以查出来,如下图:

            但React Native本身并不提供直接读取系统属性的功能,这时候就需要手动开发一个原生插件来完成这项功能,具体步骤如下。

     二、创建插件

    1、创建SystemProperty类

    在android\app\src\main\java\com\videoplayer下创建一个java类SystemProperty.java

     源码如下:

    1. package com.videoplayer;
    2. import android.widget.Toast;
    3. import com.facebook.react.bridge.Promise;
    4. import com.facebook.react.bridge.ReactApplicationContext;
    5. import com.facebook.react.bridge.ReactContextBaseJavaModule;
    6. import com.facebook.react.bridge.ReactMethod;
    7. import java.lang.reflect.InvocationTargetException;
    8. import java.lang.reflect.Method;
    9. import androidx.annotation.NonNull;
    10. public class SystemProperty extends ReactContextBaseJavaModule {
    11. private static ReactApplicationContext reactContext;
    12. private static Method sysPropGet;
    13. private static Method sysPropSet;
    14. static {
    15. try {
    16. Class<?> S = Class.forName("android.os.SystemProperties");
    17. Method M[] = S.getMethods();
    18. for (Method m : M) {
    19. String n = m.getName();
    20. if (n.equals("get")) {
    21. sysPropGet = m;
    22. } else if (n.equals("set")) {
    23. sysPropSet = m;
    24. }
    25. }
    26. } catch (ClassNotFoundException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. public SystemProperty(ReactApplicationContext context) {
    31. super(context);
    32. reactContext = context;
    33. }
    34. @NonNull
    35. @Override
    36. public String getName() {
    37. return "SystemProperty";
    38. }
    39. @ReactMethod
    40. public void getSystemProperty(String name,Promise promise) {
    41. try {
    42. String value=(String) sysPropGet.invoke(null, name,"");
    43. promise.resolve(value);
    44. } catch (Exception e) {
    45. Toast.makeText(getReactApplicationContext(), "获取卡号出错", Toast.LENGTH_LONG).show();
    46. promise.reject("获取卡号出错", e);
    47. e.printStackTrace();
    48. }
    49. }
    50. }

    该类继承了ReactContextBaseJavaModule,这是开发React Native插件必须要继承的类,并在getName方法中返回SystemProperty,当然也可以返回其他名字,这个名字是在前端JavaScript中要用到的。其中getSystemProperty方法的第一个参数为要获取的系统属性名,第二个参数为Promise类型,在JavaScript端可以使用awiat或then的方式获取数据。

    Java 方法需要使用注解@ReactMethod。方法的返回类型必须为void。React Native 的跨语言访问是异步进行的,所以想要给 JavaScript 返回一个值的唯一办法是使用回调函数或者发送事件。

    2、创建SystemPropertyPackage类

    在 Java 这边要做的最后一件事就是注册这个模块。我们需要在应用的 Package 类的createNativeModules方法中添加这个模块。如果模块没有被注册,它也无法在 JavaScript 中被访问到。在android\app\src\main\java\com\videoplayer下创建一个java类SystemPropertyPackage.java。这个 package 需要在MainApplication.java文件的getPackages方法中提供。这个文件位于你的 react-native 应用文件夹的 android 目录中。

     源码如下:

    1. package com.videoplayer;
    2. import com.facebook.react.ReactPackage;
    3. import com.facebook.react.bridge.NativeModule;
    4. import com.facebook.react.bridge.ReactApplicationContext;
    5. import com.facebook.react.uimanager.ViewManager;
    6. import java.util.ArrayList;
    7. import java.util.Collections;
    8. import java.util.List;
    9. import androidx.annotation.NonNull;
    10. public class SystemPropertyPackage implements ReactPackage {
    11. @NonNull
    12. @Override
    13. public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
    14. List<NativeModule> modules = new ArrayList<>();
    15. modules.add(new SystemProperty(reactContext));
    16. return modules;
    17. }
    18. @NonNull
    19. @Override
    20. public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
    21. return Collections.emptyList();
    22. }
    23. }

    3、修改MainApplication类 

    在MainApplication.java中添加如下行,注册SystemProperty插件

    三、使用插件

    1. import {
    2. NativeModules
    3. } from 'react-native';
    4. let value=await NativeModules.SystemProperty.getSystemProperty("persist.sys.mmcp.smarcardid");

  • 相关阅读:
    QT实现将两个时间相加的算法[hh: mm + hh: mm]
    【Java-LangChain:使用 ChatGPT API 搭建系统-1】简介
    d与C++的绑定的Calypso工具
    Golang基础7-并发编程
    微电网鲁棒性研究(Matlab代码实现)
    什么是 DeGods NFT 系列?
    安装第三方库-whl文件
    fpga时序相关概念与理解
    当新手小白有了一块【香橙派OrangePi AIpro】.Demo
    Python工具箱系列(五十三)
  • 原文地址:https://blog.csdn.net/leonMary/article/details/125607847