当前位置: 首页 > 知识库问答 >
问题:

反应本机Android模块

翁建弼
2023-03-14

我正在尝试为没有经验的霍尼韦尔CT50设备实施React Native Android模块。该模块将监听设备上内置激光扫描仪的扫描。

我已经在React本机站点上完成了正式的演练,我已经成功地设置了一个基本模块,可以在RN组件中接收到一个简单的值。到目前为止,我的代码如下所示:

霍尼韦尔CT50包装:

public class HoneywellCT50Package implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new HoneywellCT50Module(reactContext));
        return modules; 
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

霍尼韦尔CT50模块:

public class HoneywellCT50Module extends ReactContextBaseJavaModule {
    private ReactApplicationContext reactContext;

    private Callback successCallback;

    public HoneywellCT50Module(ReactApplicationContext reactContext) {
      super(reactContext);
      this.reactContext = reactContext;
    }


    @ReactMethod
    public void doSomething(
      int a,
      int b,
      Callback successCallback
    ) {
      boolean equal = a == b;
      successCallback.invoke(equal);
    }


    @Override
    public String getName() {
      return "HoneywellCT50";
    }
}

React Native Component(在组件中)

NativeModules.HoneywellCT50.doSomething(
    5,
    10,
    (equal) => {
        ToastAndroid.show(`Result: ${equal}`, ToastAndroid.LONG);
    }
);

returns false

我正在努力理解现在如何将原生Android类(包含在.jar中)中的方法映射为原生的。我并不是在寻找一个完整的解决方案,但如果有人能帮助解释我将如何开始使用以下方法进行此操作,我将不胜感激:

Android类

public class MainActivity extends Activity implements BarcodeReader.BarcodeListener {
    private AidcManager manager;
    private BarcodeReader reader;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // create the AidcManager providing a Context and an
        // CreatedCallback implementation.
        AidcManager.create(this, new AidcManager.CreatedCallback() {

            @Override
            public void onCreated(AidcManager aidcManager) {
                manager = aidcManager;
                // use the manager to create a BarcodeReader with a session
                // associated with the internal imager.
                reader = manager.createBarcodeReader();

                try {
                    // apply settings
                    reader.setProperty(BarcodeReader.PROPERTY_CODE_39_ENABLED, false);
                    reader.setProperty(BarcodeReader.PROPERTY_DATAMATRIX_ENABLED, true);

                    // set the trigger mode to automatic control
                    reader.setProperty(BarcodeReader.PROPERTY_TRIGGER_CONTROL_MODE,
                        BarcodeReader.TRIGGER_CONTROL_MODE_AUTO_CONTROL);
                } catch (UnsupportedPropertyException e) {
                    Toast.makeText(MainActivity.this, "Failed to apply properties",
                        Toast.LENGTH_SHORT).show();
                }

                // register bar code event listener
                reader.addBarcodeListener(MainActivity.this);
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        if (reader != null) {
            try {
                reader.claim();
            } catch (ScannerUnavailableException e) {
                e.printStackTrace();
                Toast.makeText(this, "Scanner unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (reader != null) {
            // release the scanner claim so we don't get any scanner
            // notifications while paused.
            reader.release();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (reader != null) {
            // unregister barcode event listener
            reader.removeBarcodeListener(this);

            // close BarcodeReader to clean up resources.
            // once closed, the object can no longer be used.
            reader.close();
        }
        if (manager != null) {
            // close AidcManager to disconnect from the scanner service.
            // once closed, the object can no longer be used.
            manager.close();
        }
    }

    @Override
    public void onBarcodeEvent(final BarcodeReadEvent event) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String barcodeData = event.getBarcodeData();
                String timestamp = event.getTimestamp();

                // update UI to reflect the data
            }
        });
    }

    @Override
    public void onFailureEvent(final BarcodeFailureEvent event) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, "Barcode read failed",
                    Toast.LENGTH_SHORT).show();
            }
        });
    }
}

非常感谢。

编辑

为了达到这一点,我看了以下教程:

  • https://shift.infinite.red/native-modules-for-react-native-android-ac05dbda800d#.bl0zke73p
  • http://facebook.github.io/react-native/docs/native-modules-android.html
  • https://medium.com/@sejoker/写Android组件-反应本机-e34802bf3377#. ia8jwh6to
  • https://www.sitepoint.com/access-platform-apis-with-react-native-modules/

进一步编辑

经过进一步研究,我发现了一个为此目的开发的Cordova插件:

  • https://github.com/icsfl/cordova-honeywell/blob/master/src/android/HoneywellScannerPlugin.java

我确实考虑过使用React Native Cordova桥:

  • https://github.com/axemclion/react-native-cordova-plugin

但不幸的是,这不再适用于最新版本的React Native(

我尝试过使用Cordova插件中的一些方法,但我对React-Native/Cordova/Java没有足够的经验来找出如何使其工作。

为了进一步解释我在寻找什么:

>

  • 我是否需要每个相应的霍尼韦尔方法的ReactMethod?

    我可以简单地为onBarcodeEvent创建一个ReactMethod吗?

    我必须使用哪些反应桥方法从扫描仪中获取值?

  • 共有1个答案

    澹台俊材
    2023-03-14

    所以基本上,你们需要从原生Android组件传递一些数据到react组件,是吗?如果是这样,请看以下答案:

    • https://stackoverflow.com/a/38727123/3186465

    以及带有工作解决方案的演示:

    • https://github.com/dmba/rct-native2js
     类似资料:
    • info JS服务器已在运行。安装应用程序的信息。。。 任务:@react-native-community_datetimepicker:compiledBugJavaWithJavaC 任务:react-nate-fbsdk: compileDebugJavaBackJavac 任务:反应本机手势处理程序:CompiledBugJavaWithJavaC 任务:反应本机映射:CompiledB

    • 我正在设置环境,开始开发react原生应用程序。我不断发现以下错误: PS C:\map\development\learnreact\react native\helloworld 配置项目:应用程序在不一致的位置“C:\Users\bheka\AppData\Local\Android\Sdk\platform tools”(预期为“C:\Users\bheka\AppData\Local\A

    • 当我想运行反应-本机运行-Android命令我看到 失败:构建失败,有一个异常。 > 哪里出错了:配置根项目'reactNativeCliTest'时出现问题。 无法解析配置“:classpath”的所有依赖项。无法下载gradle core。jar(com.android.tools.build:gradle-core:2.2.3)无法获取资源的https://jcenter.bintray.c

    • 失败:生成失败,出现异常。 > 错误:任务“:app:installdebug”执行失败。 com.android.builder.testing.api.deviceException:没有连接的设备! 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。使用--scan运行以获得完整的见解。 请访问https://help.gr

    • 问题内容: 我正在React Native中开发一个需要使用Web Map Services的移动应用程序。我尚未找到任何允许同时使用WMS并进行本机响应的库或框架。在React(Web)中,我找到了一个。我的问题是: 您是否知道是否存在允许我使用WMS和React Native的任何库或框架,或者是否有可能在React native中集成React(web)库? 谢谢! 问题答案: 我决定使用的

    • 我将安装Android studio并在其上运行react native,但它是否仍能为我提供iOS apk!?我听说我们不需要为iOS重写react本机代码。