VirtualDisplay + imagereader = черный экран (android)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 VirtualDisplay + imagereader = черный экран (android)

Сообщение Anonymous »

Код: Выделить всё

public void initDisplay(final Activity activity, int width, int height) {

...

createImageReader();

mMainHandler.post(() -> {
createVirtualDisplay();
});

}

protected void createImageReader() {
mImageReaderLock.lock();
try {
_imagePreviewReader = ImageReader.newInstance(mTextureWidth, mTextureHeight, PixelFormat.RGBA_8888, 2);
_imagePreviewReader.setOnImageAvailableListener(this, mMainHandler);
mSurface = _imagePreviewReader.getSurface();
} finally {
mImageReaderLock.unlock();
}
}

protected void createVirtualDisplay() {
int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; // | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;

//int density = DisplayMetrics.DENSITY_DEVICE_STABLE;
// display metrics
DisplayMetrics metrics = mMainActivity.getResources().getDisplayMetrics();
int density = metrics.densityDpi;

virtualDisplay = displayManager.createVirtualDisplay("virtual_draw",
mTextureWidth, mTextureHeight, density, mSurface, flags);

presentation = new Presentation(this.mMainActivity, virtualDisplay.getDisplay());

myView = internalCreate(this.mMainActivity);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(mTextureWidth, mTextureHeight);

presentation.setContentView(myView, layoutParams);
presentation.show();
myView.setFocusable(true);
myView.setFocusableInTouchMode(true);
myView.requestFocus();

}

public int updateTexture() {
/*
if (mFrameAvailable) {
if (!Thread.currentThread().getName().equals("UnityMain")) {
Log.e(TAG, "Not called from render thread and hence update texture will fail");
throw new RuntimeException("Not called from render thread and hence update texture will fail ( " + Thread.currentThread().getName() + " )");
} else
{
//mSurfaceTexture.updateTexImage();
mFrameAvailable = false;
}
}
*/
synchronized (this) {
if (mFrameUpdated) {
mFrameUpdated = false;
}

GLES32.glActiveTexture(GLES32.GL_TEXTURE0);
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, mUnityTextureID);

Image image = _imagePreviewReader.acquireLatestImage();
if (image != null) {
Buffer buffer = image.getPlanes()[0].getBuffer();
/*
this code work
Bitmap bitmap = Bitmap.createBitmap(mTextureWidth, mTextureHeight, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.GREEN);
Canvas canvas = new Canvas(bitmap);
mP.setColor(Color.argb(255, mRnd.nextInt(255), mRnd.nextInt(255), mRnd.nextInt(255)));
int radius = mRnd.nextInt(100);
canvas.drawCircle(mRnd.nextInt(mTextureWidth), mRnd.nextInt(mTextureHeight), radius, mP);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0, bitmap, 0);
*/
GLES30.glTexSubImage2D(GLES30.GL_TEXTURE_2D, 0, 0, 0, mTextureWidth, mTextureHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, buffer);

image.close();
}
// mSurfaceTexture.updateTexImage();

return mUnityTextureID;
}

}

3 недели назад мой код работал на смартфоне Android, но 2 недели назад я попробовал его в шлеме мета-квеста, и дисплей был чересстрочным, затем я попытался найти ошибку и изменил мой код, и поскольку у меня черный экран (смартфон и квест), то же самое, если я напишу исходный код.
Я попробовал любой тест, чтобы исключить другие причины, связанные с передачей кода изображение на моей текстуре, это работает.
во-первых, я хотел бы иметь возможность найти исходное отображение моего представления, я думаю, что в первую очередь ошибка связана либо с ImageReader, либо с виртуальным дисплеем. потому что я не нашел способа их проверить.

Подробнее здесь: https://stackoverflow.com/questions/788 ... en-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»