Я пытаюсь перенести предварительный просмотр камеры из родного Java-плагина в одно целое.
Я создаю Texture2D в Unity, делю имя openGl на плагин Java. В java-коде я создаю SearTexture и запускаю камеру с этой текстурой. Я ожидаю, что на стороне Unity я увижу предварительный просмотр камеры.
Быт я вижу только черный скрин.
Также в logcat есть несколько ошибок:
09-13 10:58:36.979 9773-9773/com.aaa.nativecamera E/MPlugin: Unsupported class: com.mediatek.common.telephony.IOnlyOwnerSimSupport
09-13 10:58:41.557 9773-9799/com.aaa.nativecamera E/NativeCrypto: ssl=0xdf2c07c0 cert_verify_callback x509_store_ctx=0xcaf7f4ac arg=0x0
ssl=0xdf2c07c0 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
09-13 10:58:43.113 9773-9800/com.aaa.nativecamera E/NativeCrypto: ssl=0xc742bcc0 cert_verify_callback x509_store_ctx=0xcae804ac arg=0x0
ssl=0xc742bcc0 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
также в logcat появляется странное сообщение
09-13 11:02:17.797 9773-9785/com.aaa.nativecamera I/BufferQueueProducer: [SurfaceTexture-22-9773-0](this:0xc73fa000,id:0,api:4,p:412,c:9773) queueBuffer: slot 1 is dropped, handle=0xe7fb4400
родной плагин Java:
...
public int startCamera(int pointer){
PermissionFragment.RequestPermissions();
int texturePointer = createExternalTexture(pointer);
mSurfaceTexture = new SurfaceTexture(texturePointer);
mSurfaceTexture.setOnFrameAvailableListener(this);
mSurfaceTexture.detachFromGLContext();
startPreview();
return texturePointer;
}
...
private void startPreview() {
mCamera = Camera.open();
if (mCamera == null) {
throw new RuntimeException("Default camera not available");
}
try {
mCamera.setPreviewTexture(mSurfaceTexture);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException ioe) {
// Something bad happened
}
}
...
private int createExternalTexture(int pointer) {
int[] textureIdContainer = new int[1];
int error;
if (pointer == 0) {
GLES20.glGenTextures(1, textureIdContainer, 0);
error = GLES20.glGetError();
} else {
textureIdContainer[0] = pointer;
}
GLES20.glActiveTexture(GLES10.GL_TEXTURE0 + textureIdContainer[0]);//GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
error = GLES20.glGetError();
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES10.GL_TEXTURE0 + textureIdContainer[0]);
error = GLES20.glGetError();
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
error = GLES20.glGetError();
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
error = GLES20.glGetError();
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
error = GLES20.glGetError();
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
error = GLES20.glGetError();
return textureIdContainer[0];
}
Скрипт Unity:
void Start ()
{
nativeCamera = new NativeCamera();
texture = new Texture2D(1024, 720, TextureFormat.ARGB32 ,false, false);
p = nativeCamera.StartCamera((int) texture.GetNativeTexturePtr());
rawImage.texture = texture;
}
Буду благодарен, если вы укажете на мою ошибку.
Извините за мой английский.