1

我正在尝试将 java 代码与我的 react native 项目桥接。

我的流程是这样的 - 当用户在 react native 中单击我的支付按钮时,它会路由到用 java 编写的页面(这是一个支付网关),然后当用户完成支付过程时,它会路由回初始页面在本机反应。我收到以下错误:

HelloWorldModule.java:56: error: incompatible types: ReactApplicationContext cannot be converted
    to Activity
                                    new RavePayManager((Activity)reactContext).setAmount(Double.parseDouble(String.valueOf(amount)))

请看下面我的代码: //React native code to connect to java

// We are importing the native Java module here
import {NativeModules} from 'react-native';
var HelloWorld = NativeModules.HelloWorld;

// type Props = {};
export default class App extends Component {

  // async function to call the Java native method
  async sayHiFromJava() {
    HelloWorld.sayHi( (err) => {console.log(err)}, (msg) => {console.log(msg)} );
  }

  render() {
    return (
      <View style={styles.container}>
        <TouchableOpacity onPress={ this.sayHiFromJava }>
              <Text>Invoke native Java code</Text>
         </TouchableOpacity>
      </View>
    );
  }
}

// MainApplication.java

package com.packagename;

import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.RNFetchBlob.RNFetchBlobPackage;
import com.reactnativecommunity.geolocation.GeolocationPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import com.facebook.react.bridge.Callback;



public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost =
      new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
          return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // Packages that cannot be autolinked yet can be added manually here, for example:
          // packages.add(new MyReactNativePackage());
          packages.add(new HelloWorldPackage(MainApplication.this)); ---- // added payment gateway
          return packages;
        } 

        @Override
        protected String getJSMainModuleName() {
          return "index";
        }
      };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }


  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
    initializeFlipper(this); // Remove this line if you don't want Flipper enabled
  }

  /**
   * Loads Flipper in React Native templates.
   *
   * @param context
   */
  private static void initializeFlipper(Context context) {
    if (BuildConfig.DEBUG) {
      try {
        /*
         We use reflection here to pick up the class that initializes Flipper,
        since Flipper library is not available in release mode
        */
        Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper");
        aClass.getMethod("initializeFlipper", Context.class).invoke(null, context);
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      } catch (NoSuchMethodException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (InvocationTargetException e) {
        e.printStackTrace();
      }
    }
  }
}

// HelloWorldModule.java - 支付网关代码

package com.packagename;

import com.facebook.react.bridge.ReactApplicationContext;
import android.content.Context;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;
import com.flutterwave.raveandroid.RaveConstants;
import com.flutterwave.raveandroid.RavePayActivity;
import com.flutterwave.raveandroid.RavePayManager;
import android.app.Activity;

public class HelloWorldModule extends ReactContextBaseJavaModule {
    Context context;

 ReactApplicationContext reactContext;
    public HelloWorldModule(ReactApplicationContext reactContext,Context context) {
        super(reactContext); //required by React Native
        this.reactContext= reactContext;
          this.context= context;


    }

    @Override
    //getName is required to define the name of the module represented in JavaScript
    public String getName() { 
        return "HelloWorld";
    }

    @ReactMethod
    public void sayHi(Callback errorCallback, Callback successCallback) {
    //     try {
    //        System.out.println("Greetings from Java");

    //        successCallback.invoke("Callback : Greetings from Java");
    //    } catch (IllegalViewOperationException e) {
    //         errorCallback.invoke(e.getMessage());
    //     }
        try{
            int amount = 100;//call.argument("amount");
                        String narration = "Payment for soup";//call.argument("nara");
                        String countryCode = "NG"; //call.argument("countryCode");
                        String currency =  "NGN"; //call.argument("currency");
                        String amountText = "100";//call.argument("amountText");
                        String email = "haha@gmail.com";//call.argument("email");
                        String name = "King John";//call.argument("name");
                        String paymentId = "a98sjkhdjdu";//call.argument("paymentId");



                        String key ="*********-***********-X";
                         String secret = "*********-*********-X";

                                new RavePayManager((Activity)reactContext).setAmount(Double.parseDouble(String.valueOf(amount)))
                                .setCountry(countryCode)
                                .setCurrency(currency)
                                .setEmail(email)
                                .setfName(name)
                                .setlName("")
                                .setNarration(narration)
                                .setPublicKey(key)
                                .setTxRef(paymentId)
                                .acceptMpesaPayments(false)
                                .acceptAccountPayments(true)
                                .acceptCardPayments(true)
                                .acceptGHMobileMoneyPayments(false)
                                .onStagingEnv(false)
                                .initialize();
        } catch (IllegalViewOperationException e) {
            errorCallback.invoke(e.getMessage());
        }                  

    }

}

// HelloWorldPackage.java

package com.packagename;

import com.facebook.react.ReactPackage;
import android.content.Context;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.visioncapitaleye.HelloWorldModule;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HelloWorldPackage implements ReactPackage {
Context context;

    HelloWorldPackage(Context context) {
        this.context = context;
    }

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

    @Override
    public List<NativeModule> createNativeModules(
            ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        //this is where you register the module
        modules.add(new HelloWorldModule(reactContext,context)); // added HelloWorldModule
        return modules;
    }
}

我是java新手,似乎无法弄清楚我做错了什么。请协助。

4

1 回答 1

0

在尝试将 sdk 集成到现有的 react-native 项目中时,我遇到了类似的问题。尝试以下方法,看看它是否适合您。无需将 reactContext 转换为 Activity,只需获取当前活动并使用它即可。

final Activity activity = getCurrentActivity();
于 2021-03-02T14:57:50.473 回答