a0590dccb5
* Setup RN Worklets * Use RN Worklets on iOS * Fix console * Add `installFrameProcessorBindings()` function * Add `FrameProcessorPlugins` proxy (BREAKING CHANGE) * Clean up docs * Update FRAME_PROCESSORS.mdx * Use RN Worklets 0.2.5 * feat: Android build setup * Rewrite Android Frame Processor Part * Update CMakeLists.txt * fix: Add react-native-worklets Gradle dependency * Update Podfile.lock * fix build * gradle:7.4.1 * Init JSI Bindings in method on Android * Fix Folly flags * fix: Init `FrameProcessorRuntimeManager` later * fix: Wrap in `<GestureHandlerRootView>` * Refactor plugins * fix: Remove enableFrameProcessors * Install RN Worklets from current GH master * Update babel.config.js * Update CameraViewModule.kt * Update ImageProxyUtils.java * feat: Upgrade to Reanimated v3 * fix: Fix crash on Worklet init * Update RN Worklets to latest master * fix: Simplify FP Plugins Proxy
184 lines
6.4 KiB
Plaintext
184 lines
6.4 KiB
Plaintext
---
|
|
id: frame-processors-plugins-android
|
|
title: Creating Frame Processor Plugins
|
|
sidebar_label: Creating Frame Processor Plugins (Android)
|
|
---
|
|
|
|
import Tabs from '@theme/Tabs';
|
|
import TabItem from '@theme/TabItem';
|
|
|
|
## Creating a Frame Processor Plugin for Android
|
|
|
|
The Frame Processor Plugin API is built to be as extensible as possible, which allows you to create custom Frame Processor Plugins.
|
|
In this guide we will create a custom QR Code Scanner Plugin which can be used from JS.
|
|
|
|
Android Frame Processor Plugins can be written in either **Java**, **Kotlin** or **C++ (JNI)**.
|
|
|
|
### Mostly automatic setup
|
|
|
|
1. Run [Vision Camera Plugin Builder CLI](https://github.com/mateusz1913/vision-camera-plugin-builder)
|
|
|
|
```sh
|
|
npx vision-camera-plugin-builder android
|
|
```
|
|
|
|
:::info
|
|
The CLI will ask you for the path to project's Android Manifest file, name of the plugin (e.g. `QRCodeFrameProcessor`), name of the exposed method (e.g. `scanQRCodes`) and language you want to use for plugin development (Java or Kotlin).
|
|
For reference see the [CLI's docs](https://github.com/mateusz1913/vision-camera-plugin-builder#%EF%B8%8F-options).
|
|
:::
|
|
|
|
2. Register the package in MainApplication.java
|
|
|
|
```java {6}
|
|
@Override
|
|
protected List<ReactPackage> getPackages() {
|
|
@SuppressWarnings("UnnecessaryLocalVariable")
|
|
List<ReactPackage> packages = new PackageList(this).getPackages();
|
|
...
|
|
packages.add(new QRCodeFrameProcessorPluginPackage()); // <- add
|
|
return packages;
|
|
}
|
|
```
|
|
|
|
### Manual setup
|
|
|
|
<Tabs
|
|
defaultValue="java"
|
|
values={[
|
|
{label: 'Java', value: 'java'},
|
|
{label: 'Kotlin', value: 'kotlin'}
|
|
]}>
|
|
<TabItem value="java">
|
|
|
|
1. Open your Project in Android Studio
|
|
2. Create a Java source file, for the QR Code Plugin this will be called `QRCodeFrameProcessorPlugin.java`.
|
|
3. Add the following code:
|
|
|
|
```java {8}
|
|
import androidx.camera.core.ImageProxy;
|
|
import com.mrousavy.camera.frameprocessor.FrameProcessorPlugin;
|
|
|
|
public class QRCodeFrameProcessorPlugin extends FrameProcessorPlugin {
|
|
|
|
@Override
|
|
public Object callback(ImageProxy image, Object[] params) {
|
|
// code goes here
|
|
return null;
|
|
}
|
|
|
|
QRCodeFrameProcessorPlugin() {
|
|
super("scanQRCodes");
|
|
}
|
|
}
|
|
```
|
|
|
|
:::note
|
|
The Frame Processor Plugin will be exposed to JS through the `FrameProcessorPlugins` object using the name you pass to the `super(...)` call. In this case, it would be `FrameProcessorPlugins.scanQRCodes(...)`.
|
|
:::
|
|
|
|
4. **Implement your Frame Processing.** See the [Example Plugin (Java)](https://github.com/mrousavy/react-native-vision-camera/blob/main/example/android/app/src/main/java/com/mrousavy/camera/example/ExampleFrameProcessorPlugin.java) for reference.
|
|
5. Create a new Java file which registers the Frame Processor Plugin in a React Package, for the QR Code Scanner plugin this file will be called `QRCodeFrameProcessorPluginPackage.java`:
|
|
|
|
```java {12}
|
|
import com.facebook.react.ReactPackage;
|
|
import com.facebook.react.bridge.NativeModule;
|
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
import com.facebook.react.uimanager.ViewManager;
|
|
import com.mrousavy.camera.frameprocessor.FrameProcessorPlugin;
|
|
import javax.annotation.Nonnull;
|
|
|
|
public class QRCodeFrameProcessorPluginPackage implements ReactPackage {
|
|
@NonNull
|
|
@Override
|
|
public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
|
|
FrameProcessorPlugin.register(new QRCodeFrameProcessorPlugin());
|
|
return Collections.emptyList();
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public List<ViewManager> createViewManagers(@Nonnull ReactApplicationContext reactContext) {
|
|
return Collections.emptyList();
|
|
}
|
|
}
|
|
```
|
|
|
|
6. Register the package in MainApplication.java
|
|
|
|
```java {6}
|
|
@Override
|
|
protected List<ReactPackage> getPackages() {
|
|
@SuppressWarnings("UnnecessaryLocalVariable")
|
|
List<ReactPackage> packages = new PackageList(this).getPackages();
|
|
...
|
|
packages.add(new QRCodeFrameProcessorPluginPackage()); // <- add
|
|
return packages;
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="kotlin">
|
|
|
|
1. Open your Project in Android Studio
|
|
2. Create a Kotlin source file, for the QR Code Plugin this will be called `QRCodeFrameProcessorPlugin.kt`.
|
|
3. Add the following code:
|
|
|
|
```kotlin {7}
|
|
import androidx.camera.core.ImageProxy
|
|
import com.mrousavy.camera.frameprocessor.FrameProcessorPlugin
|
|
|
|
class ExampleFrameProcessorPluginKotlin: FrameProcessorPlugin("scanQRCodes") {
|
|
|
|
override fun callback(image: ImageProxy, params: Array<Any>): Any? {
|
|
// code goes here
|
|
return null
|
|
}
|
|
}
|
|
```
|
|
|
|
:::note
|
|
The Frame Processor Plugin will be exposed to JS through the `FrameProcessorPlugins` object using the name you pass to the `FrameProcessorPlugin(...)` call. In this case, it would be `FrameProcessorPlugins.scanQRCodes(...)`.
|
|
:::
|
|
|
|
4. **Implement your Frame Processing.** See the [Example Plugin (Java)](https://github.com/mrousavy/react-native-vision-camera/blob/main/example/android/app/src/main/java/com/mrousavy/camera/example/ExampleFrameProcessorPlugin.java) for reference.
|
|
5. Create a new Kotlin file which registers the Frame Processor Plugin in a React Package, for the QR Code Scanner plugin this file will be called `QRCodeFrameProcessorPluginPackage.kt`:
|
|
|
|
```kotlin {9}
|
|
import com.facebook.react.ReactPackage
|
|
import com.facebook.react.bridge.NativeModule
|
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
import com.facebook.react.uimanager.ViewManager
|
|
import com.mrousavy.camera.frameprocessor.FrameProcessorPlugin
|
|
|
|
class QRCodeFrameProcessorPluginPackage : ReactPackage {
|
|
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
|
FrameProcessorPlugin.register(ExampleFrameProcessorPluginKotlin())
|
|
return emptyList()
|
|
}
|
|
|
|
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
return emptyList()
|
|
}
|
|
}
|
|
```
|
|
|
|
6. Register the package in MainApplication.java
|
|
|
|
```java {6}
|
|
@Override
|
|
protected List<ReactPackage> getPackages() {
|
|
@SuppressWarnings("UnnecessaryLocalVariable")
|
|
List<ReactPackage> packages = new PackageList(this).getPackages();
|
|
...
|
|
packages.add(new QRCodeFrameProcessorPluginPackage()); // <- add
|
|
return packages;
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
<br />
|
|
|
|
#### 🚀 Next section: [Finish creating your Frame Processor Plugin](frame-processors-plugins-final) (or [add iOS support to your Frame Processor Plugin](frame-processors-plugins-ios))
|