Anonymous
VirtualDisplay + imagereader = черный экран (android)
Сообщение
Anonymous » 28 июл 2024, 21:18
Код: Выделить всё
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() {
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
1722190695
Anonymous
[code]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() { 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; } } [/code] 3 недели назад мой код работал на смартфоне Android, но 2 недели назад я попробовал его в шлеме мета-квеста, и дисплей был чересстрочным, затем я попытался найти ошибку и изменил мой код, и поскольку у меня черный экран (смартфон и квест), то же самое, если я напишу исходный код. Я попробовал любой тест, чтобы исключить другие причины, связанные с передачей кода изображение на моей текстуре, это работает. во-первых, я хотел бы иметь возможность найти исходное отображение моего представления, я думаю, что в первую очередь ошибка связана либо с ImageReader, либо с виртуальным дисплеем. потому что я не нашел способа их проверить. Подробнее здесь: [url]https://stackoverflow.com/questions/78801170/virtualdisplay-imagereader-blackscreen-android[/url]