Utilice APL (Android Programming Language) para crear un complemento de Android para Unreal Engine 4
Estoy tratando de desarrollar Unreal Engine 4 plugin para Android cámara API 2.
Como pude leer en los foros de motor irreal, hay dos posibilidades de hacer un complemento para Android.
- Android "Permiso de negación: no se puede utilizar la cámara"
- Android: cambia entre la cámara frontal y posterior mientras graba un vídeo
- Android convertir Imagen de ImageReader a YCbCr_420_SP (NV21) matriz de bytes utilizando script de render?
- Añadir etiquetas de texto en el archivo de salida de vídeo utilizando la API de la cámara2
- ¿Cuál es la diferencia entre ActivityCompat y ContextCompat?
La primera consiste en modificar el proyecto base de la UE para Android (GameActivity).
El segundo es un plugin independiente, que trae portabilidad para agregar los complementos en cualquier proyecto.
De acuerdo con este post , es posible hacer una cámara Api1 plugin autónomo, que utiliza el archivo APL.xml para agregar código java.
Pero creo que es muy limitado a una actividad de juego, como el código de abajo.
<?xml version="1.0" encoding="utf-8"?> <!--ARToolKit plugin additions--> <root xmlns:android="http://schemas.android.com/apk/res/android"> <!-- init section is always evaluated once per architecture --> <init> <log text="AndroidCamera init"/> </init> <androidManifestUpdates> <addPermission android:name="android.permission.CAMERA"/> <addFeature android:name="android.hardware.camera"/> <addFeature android:name="android.hardware.camera.autofocus"/> </androidManifestUpdates> <!-- optional additions to the GameActivity imports in GameActivity.java --> <gameActivityImportAdditions> <insert> import android.widget.Toast; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.PreviewCallback; import android.graphics.SurfaceTexture; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import java.util.List; import java.io.IOException; import android.util.Log; </insert> </gameActivityImportAdditions> <gameActivityClassAdditions> <insert> static String msg = "yes i am a rock!"; SurfaceTexture surfaceTexture; Camera camera; public native boolean nativeGetFrameData(int frameWidth, int frameHeight, byte[] data); public void AndroidThunkJava_Toast() { try { _activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(_activity.getApplicationContext(), "cam o yeah!", Toast.LENGTH_SHORT).show(); } }); } catch (Exception e) { Log.debug("Toast failed with exception " + e.getMessage()); } } public void AndroidThunkJava_startCamera() { surfaceTexture = new SurfaceTexture(10); surfaceTexture.setDefaultBufferSize(320,240); camera = Camera.open(); try { camera.setPreviewTexture(surfaceTexture); } catch (IOException t) { android.util.Log.e("ARToolKitLog", "Cannot set preview texture target!", t); } Parameters cameraParam = camera.getParameters(); cameraParam.setPreviewFormat(ImageFormat.NV21); cameraParam.setPreviewSize(320, 240); camera.setParameters(cameraParam); camera.setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { int Height = camera.getParameters().getPreviewSize().height; int Width = camera.getParameters().getPreviewSize().width; nativeGetFrameData(Width, Height, data); } }); camera.startPreview(); } public void AndroidThunkJava_stopCamera() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } } </insert> </gameActivityClassAdditions> <!-- optional additions to GameActivity onCreate in GameActivity.java --> <gameActivityOnCreateAdditions> <insert> //Toast.makeText(this,msg,Toast.LENGTH_LONG).show(); //AndroidThunkJava_Toast(); </insert> </gameActivityOnCreateAdditions> </root>
Así que mis preguntas son:
¿Es esta la única manera de hacer un complemento independiente para Unreal Engine 4?
¿Hay una etiqueta XML para agregar clases personalizadas en estos archivos APL?
- Android cámara2 api galaxia s7
- Zero-copia de procesamiento de la cámara y la prestación de tuberías en Android
- ¿Cómo obtener continuamente los datos de marco de la API de Camera2 para el propósito de transmisión?
- Establecer brillo / contraste en la captura de vídeo con Android Camera2
- El proceso de alojamiento del servicio de cámara ha muerto inesperadamente
- YUV_420_888 interpretación en Samsung Galaxy S7 (Camera2)
- Cómo tomar fotos mediante programación mientras graba vídeo utilizando la API de Camera2 en Andorid
- Android Camera2 toque para enfocar la implementación - cancelación en el nuevo toque
Encontré otra forma de usar clases personalizadas de Java:
Si no estoy equivocado, el archivo _APL.xml del motor irreal está conectado con el sistema de compilación de ANT.
Por lo tanto, como en los archivos _APL.xml además de definir el código Java en gameActivityClassAdditions, hay una etiqueta para copiar nuestros archivos .java al directorio de compilación de Unreal Engine.
He tomado la idea de este plugin de Unreal Engine: https://github.com/jeevcat/GoogleMapsUE4Plugin
Así, hice un plugin en 4 pasos:
- Copie las clases java personalizadas en el directorio de origen del complemento con el orden de la carpeta de paquetes, por lo que la estructura de carpetas resultante debería ser algo como esto.
2.- Agregue la etiqueta de copias preconfiguradas para aplicar la clase Java al directorio de compilación:
<prebuildCopies> <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" /> </prebuildCopies>
3.- Añadir las importaciones en gameActivityImportAdditions:
import org.samples.camera2.CameraHandler;
4.- utilizar una clase personalizada
public void AndroidThunkJava_startCamera() { m_camHandler = new CameraHandler(); m_camHandler.setCallback(new CameraCallback() { @Override public void onGetFrame(byte[] data, int width, int height) { Log.d(LOG_TAG,"MY CUSTOM CALLBACK"+width); nativeGetFrameData(width, height, data); } }); m_camHandler.init(_activity, 0, 320, 240); m_camHandler.start(); }
Finalmente muestro el archivo _APL.xml resultante:
<?xml version="1.0" encoding="utf-8"?> <!--ARToolKit plugin additions--> <root xmlns:android="http://schemas.android.com/apk/res/android"> <!-- init section is always evaluated once per architecture --> <init> <log text="AndroidCamera init"/> </init> <androidManifestUpdates> <addPermission android:name="android.permission.CAMERA" /> <addFeature android:name="android.hardware.camera" /> <addFeature android:name="android.hardware.camera.autofocus" /> <addFeature android:name="android.hardware.camera2" /> </androidManifestUpdates> <prebuildCopies> <copyDir src="$S(PluginDir)/Java" dst="$S(BuildDir)" /> </prebuildCopies> <!-- optional additions to the GameActivity imports in GameActivity.java --> <gameActivityImportAdditions> <insert> import android.widget.Toast; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.PreviewCallback; import android.graphics.SurfaceTexture; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import java.util.List; import java.io.IOException; import android.util.Log; import org.samples.camera2.CameraHandler; </insert> </gameActivityImportAdditions> <gameActivityClassAdditions> <insert> static String msg = "yes i am a rock!"; SurfaceTexture surfaceTexture; Camera camera; CameraHandler m_camHandler; public native boolean nativeGetFrameData(int frameWidth, int frameHeight, byte[] data); public void AndroidThunkJava_Toast() { try { _activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(_activity.getApplicationContext(), "cam o yeah!", Toast.LENGTH_SHORT).show(); } }); } catch (Exception e) { Log.debug("Toast failed with exception " + e.getMessage()); } } public void AndroidThunkJava_startCamera() { m_camHandler = new CameraHandler(); m_camHandler.setCallback(new CameraCallback() { @Override public void onGetFrame(byte[] data, int width, int height) { Log.d(LOG_TAG,"MY CUSTOM CALLBACK"+width); nativeGetFrameData(width, height, data); } }); m_camHandler.init(_activity, 0, 320, 240); m_camHandler.start(); } public void AndroidThunkJava_stopCamera() { } </insert> </gameActivityClassAdditions> <!-- optional additions to GameActivity onCreate in GameActivity.java --> <gameActivityOnCreateAdditions> <insert> </insert> </gameActivityOnCreateAdditions> </root>