将活动结果传递到react本机模块

时间:2018-11-21 11:35:16

标签: android react-native react-native-android

我正在尝试使用react native在文本识别方面做一些演讲。我编写了一个react模块来启动识别器意图

public class SpeechToTextModule extends ReactContextBaseJavaModule {

...

  @ReactMethod
  public void startListening(Callback errorCallback, Callback successCallback) {

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

    if(getCurrentActivity() != null){
        getReactApplicationContext().startActivityForResult(intent, SPEECH_REQUEST_CODE, null);
    } else {
        errorCallback.invoke(new NullPointerException("Activity is null"));
    }
}

  public void onActivityResult(int requestCode, int resultCode, Intent data){
    // control must come here
  }

主要活动如下:

public class MainActivity extends ReactActivity {

  ...

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // how do i invoke the module function?
  }
}

MainActivity从语音意图接收结果,但是我无法弄清楚如何将其传递给模块。

3 个答案:

答案 0 :(得分:3)

有一种方法可以register as Activity event listener

将此添加到您的本机模块:

public class SpeechToTextModule 
  extends ReactContextBaseJavaModule 
  implements ActivityEventListener {

  public SpeechToTextModule(ReactApplicationContext reactContext) {
    super(reactContext);
    reactContext.addActivityEventListener(this); //Register this native module as Activity result listener 
  }

  @Override
  public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
    // Here is your Activity result :)
  }

  @Override
  public void onNewIntent(Intent intent) {

  }
}

答案 1 :(得分:0)

接受的解决方案对我不起作用。我必须创建一个 ActivityEventListener。

public class SpeechToTextModule extends ReactContextBaseJavaModule  {
    private static ReactApplicationContext reactContext = null;
    private Callback callback;

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
            System.out.println("Called this method" + resultCode + "request code" + requestCode);
            if (requestCode == 2) {
                if (resultCode == Activity.RESULT_OK) {
                    String transactionId = data.getStringExtra("transactionId");
                    String amount = data.getStringExtra("amount");
                    String status = data.getStringExtra("status");
                    WritableMap map = Arguments.createMap();
                    map.putString("transactionId", transactionId);
                    map.putString("amount", amount);
                    map.putString("status", status);
                    callback.invoke(map);
                }
            }
        }
    };

    public SslCommerzBridgeModule(ReactApplicationContext context) {
        // Pass in the context to the constructor and save it so you can emit events
        // https://facebook.github.io/react-native/docs/native-modules-android.html#the-toast-module
        super(context);
        context.addActivityEventListener(mActivityEventListener);
        reactContext = context;
    }
}`

@ReactMethod
    public void testMethod(String sslCommerzParams, Callback callback) {
        Activity currentActivity = getCurrentActivity();
        Intent intent = new Intent(reactContext, PaymentActivity.class);
        intent.putExtra("SSL", sslCommerzParams);
        this.callback = callback;
        reactContext.startActivityForResult(intent, 2, null);
    }

我写这个是为了让它对我有用。

答案 2 :(得分:0)

我实际上在 react-native v0.64 中使用以下方法使其工作:

在您的 MainActivity 中:

...
private ReactInstanceManager mReactInstanceManager;
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    mReactInstanceManager.onActivityResult(requestCode, resultCode, data);
}

在您的模块中:

public class MyModule extends ReactContextBaseJavaModule implements ActivityEventListener {
    static final int REQUEST_VIDEO_CAPTURE = 1;

    final ReactApplicationContext reactContext;
    Promise promise;

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

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

    @ReactMethod
    public void captureVideo(Promise promise) {
        this.promise = promise;
        Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        if (takeVideoIntent.resolveActivity(this.reactContext.getPackageManager()) != null) {
            this.reactContext.startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE, null);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        this.promise.resolve(data.getDataString());
    }
}