反应原生Android模块

时间:2016-12-19 14:49:11

标签: java android module react-native

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

我已经完成了React Native网站上的官方演练,并设法建立了一个基本模块,我可以在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(&lt; 0.29)。

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

进一步解释我在寻找的内容:

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

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

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

1 个答案:

答案 0 :(得分:1)

所以基本上,你需要将一些来自原生android组件的数据传递给react组件,是吗? 如果是这样,请看看这个答案:

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