首页 文章

反应原生Android模块

提问于
浏览
0

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

我已经完成了对React Native站点的官方演练,并设法 Build 了一个基本模块,我可以在RN组件中接收一个简单的值 . 到目前为止我的代码看起来像这样:

HoneywellCT50封装:

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();
    }
}

HoneywellCT50模块:

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(在componentDidMount中)

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

returns false

我正在努力理解如何将原生Android类(包含在.jar中)中的方法映射到React Native . 我不是在寻找一个完整的解决方案,但如果有人能帮助解释我将如何开始使用以下内容,我将不胜感激:

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();
            }
        });
    }
}

提前谢谢了 .

编辑

我已经看了下面的教程来达到这一点:

进一步编辑

在进一步了解之后,我发现了一个为此目的而开发的Cordova插件:

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

但不幸的是,这不再适用于我的应用程序的其他部分所需的最新版本的React Native(<0.29) .

我已经尝试过使用Cordova插件中的一些方法但是我没有足够的经验使用React Native / Cordova / Java来弄清楚如何使其工作 .

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

  • 我是否需要针对每种相应的霍尼韦尔方法使用ReactMethod?

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

  • 必须使用哪种React Bridge方法从扫描仪获取值?

1 回答

相关问题