Сделайте снимок экрана SurfaceView

Я разрабатываю простое приложение для камеры. У меня есть код, который снимает снимок всей активности и записывает ее на карту Sd. Проблема в том, что Surfaceview возвращает черный экран.

Я хотел бы знать, как самостоятельно сделать снимок экрана только для просмотра поверхности. Вот код, который берет скриншот всей активности.

findViewById(R.id.screen).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final RelativeLayout layout = (RelativeLayout) findViewById(R.id.RelativeLayout1); layout.setVisibility(RelativeLayout.GONE); Bitmap bitmap = takeScreenshot(); Toast.makeText(getApplicationContext(),"Please Wait", Toast.LENGTH_LONG).show(); saveBitmap(bitmap); } }); } public Bitmap takeScreenshot() { View rootView = findViewById(android.R.id.content).getRootView(); rootView.setDrawingCacheEnabled(true); return rootView.getDrawingCache(); } public void saveBitmap(Bitmap bitmap) { final MediaPlayer cheer = MediaPlayer.create(PicShot.this, R.raw.shutter); cheer.start(); Random generator = new Random(); int n = 10000; n = generator.nextInt(n); String fname = "Image-"+ n +".png"; final RelativeLayout layout = (RelativeLayout) findViewById(R.id.RelativeLayout1); File imagePath = new File(Environment.getExternalStorageDirectory() + "/" + fname); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); layout.setVisibility(RelativeLayout.VISIBLE); Intent share = new Intent(Intent.ACTION_SEND); share.setType("image/*"); Uri uri = Uri.fromFile(imagePath); share.putExtra(Intent.EXTRA_STREAM,uri); startActivity(Intent.createChooser(share, "Share Image")); } catch (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); } } 

Поверхность SurfaceView не зависит от поверхности, на которой рисуются элементы View. Поэтому захват содержимого View не будет включать SurfaceView.

Вам необходимо зафиксировать содержимое SurfaceView отдельно и выполнить свой собственный шаг компоновки. Самый простой способ сделать захват – это просто перерисовать содержимое, но использовать растровое изображение вне экрана как цель, а не поверхность. Если вы выполняете рендеринг с помощью GLES на внешнем экране pbuffer, вы можете использовать glReadPixels() перед заменой буферов.

Обновление: активность «текстуры с камеры» от Grafika демонстрирует обработку видео в реальном времени с камеры с помощью OpenGL ES. EglSurfaceBase#saveFrame() показывает, как захватить рендеринг GLES в растровое изображение.

Обновление: см. Также этот ответ , который дает немного больше фона.

Если ваша ситуация позволяет это, использование TextureView вместо SurfaceView сделает эту проблему намного легче решить. Он имеет метод getBitmap() который возвращает TextureView текущего кадра в TextureView .

Intereting Posts
JavascriptInterface называется, но не показывает Toast Определение частоты / высоты для чайников Как проверить статус доставки сообщения Firebase, отправленного в приложение для Android? VideoView: исключение IllegalStateException в MediaPlayer.getVideoWidth Отмена разрешений для приложения для Android? Вставлять и удалять фрагменты в viewpager правильно Есть ли намерение запустить Android Market на страницу «Мои приложения»? Как получить событие клика в тексте маркера Обновления пользовательского интерфейса Threading в Android Разве Dagger 2 для Android не является каркасом DI, но прославил Service Locator? Подсчитайте элементы в папке с возможностью переноса, начинающиеся с определенной строки Android – Как установить изображение обоев? Kotlin: Можем ли мы использовать @Subscribe EventBus (GreenRobot) в Котлине? Я пытаюсь найти близлежащие места, такие как банки, рестораны, банкоматы внутри рисованной области на картах Google в андроиде Концепция Bean и EBean Android Аннотации