我正在尝试使用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从语音意图接收结果,但是我无法弄清楚如何将其传递给模块。
答案 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());
}
}