Je souhaite utiliser des fonctions natives avec React Native! N'y a-t-il pas un temps? Cependant, je ne recherche aucun tiers sur GitHub. Il est plein de bugs et n'est pas maintenu. Et ainsi de suite, le côté natif doit aussi écrire. Une situation comme celle-ci se produit.
Je voudrais partager une méthode de pontage des fonctions natives du côté React (js), ce qui est utile dans de tels cas.
TL;DR
Lorsque vous utilisez les fonctions natives d'Android, il existe des fonctions sans vue telles que le traitement audio et d'arrière-plan, et des fonctions avec vue telles que l'aperçu de la caméra.
Étant donné que la méthode de transmission de la valeur à React diffère selon qu'il existe une vue ou non, nous la considérerons séparément ici.
RNCameraPackage.java
package ...
import ...
public class RNCameraPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactApplicationContext) {
return Arrays.<NativeModule>asList(
new RCTCameraModule(reactApplicationContext),
new CameraModule(reactApplicationContext),
new FaceDetectorModule(reactApplicationContext)
);
}
// Deprecated in RN 0.47
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactApplicationContext) {
return Arrays.<ViewManager>asList(
new RCTCameraViewManager(),
new CameraViewManager()
);
}
}
Dans le fichier java du côté android / app / src, créez une classe qui hérite de la classe ReactContextBaseJavaModule
.
Écrivez le nom du module
Définissez la constante à utiliser côté React (sans elle)
Définissez la méthode utilisée côté React. À ce stade, l'annotation @ReactMethod est ajoutée.
CameraModule.java
//①
public class CameraModule extends ReactContextBaseJavaModule {
private static final String TAG = "CameraModule";
...
public CameraModule(ReactApplicationContext reactContext) {
super(reactContext);
mScopedContext = new ScopedContext(reactContext);
}
...
//②
@Override
public String getName() {
return "RNCameraModule";
}
//③
@Override
public Map<String, Object> getConstants() {
return Collections.unmodifiableMap(new HashMap<String, Object>() {
{
put("Type", getTypeConstants());
put("FlashMode", getFlashModeConstants());
...
}
});
}
...
//④
@ReactMethod
public void takePicture(final ReadableMap options, final int viewTag, final Promise promise) {
final ReactApplicationContext context = getReactApplicationContext();
final File cacheDirectory = mScopedContext.getCacheDirectory();
UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class);
uiManager.addUIBlock(new UIBlock() {
@Override
public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
RNCameraView cameraView = (RNCameraView) nativeViewHierarchyManager.resolveView(viewTag);
try {
if (cameraView.isCameraOpened()) {
cameraView.takePicture(options, promise, cacheDirectory);
} else {
promise.reject("E_CAMERA_UNAVAILABLE", "Camera is not running");
}
} catch (Exception e) {
promise.reject("E_CAMERA_BAD_VIEWTAG", "takePictureAsync: Expected a Camera component");
}
}
});
}
...
}
Object => ReadableMap
Array => ReadableArray
Remplacez le type par et utilisez l'argument.
Utilisez également
com.facebook.react.uimanager.ViewGroupManager
ViewGroupManager
createViewInstanceOverride
pour décrire le composant d'interface utilisateur que vous souhaitez utiliser et créer une méthode qui retourne ce composantCameraViewManager.java
package com.example;
//①
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
//②
public class CameraViewManager extends ViewGroupManager<RNCameraView> {
private static final String REACT_CLASS = "RNCamera";
@Override
public void onDropViewInstance(RNCameraView view) {
view.stop();
super.onDropViewInstance(view);
}
//③
// Component name that will be called from JavaScript
@Override
public String getName() {
return REACT_CLASS;
}
//④
// Return the view component instantiated with Activity context
@Override
public TextView createViewInstance(ThemedReactContext reactContext) {
return new RNCameraView(themedReactContext);
}
}
RNCamera.js
pour qu'il puisse être utilisé comme fichier séparé.OriginalCamera.js
import { NativeModules } from `react-native`;
export default NativeModules.RNCameraModule;
Recommended Posts