Intereting Posts

Я хочу программно сделать снимок экрана моего приложения для Android

Я хочу программно сделать снимок экрана моего приложения Android, который является приложением для video calling , используя протокол openSIPS. Во время видеовызова мне нужно снять снимки экрана. Я уже что-то пробовал, но он дает скриншот, кроме фрагмента видеокамеры.

Вот моя попытка:

 public static Bitmap takeScreenshot() { View rootView = mVideoView.getRootView(); rootView.setDrawingCacheEnabled(true); //rootView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY), //MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY)); // rootView.layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); rootView.buildDrawingCache(true); // rootView.destroyDrawingCache(); return rootView.getDrawingCache(); } 

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

Хорошо, теперь у меня есть идеальный ответ для меня. Вот.

 if (InCallActivity.capture) { int widthx = width; int heightx = height; int screenshotSize = widthx * heightx; ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); bb.order(ByteOrder.nativeOrder()); gl.glReadPixels(0, 0, widthx, heightx, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb); int pixelsBuffer[] = new int[screenshotSize]; bb.asIntBuffer().get(pixelsBuffer); bb = null; Bitmap bitmap = Bitmap.createBitmap(widthx, heightx, Bitmap.Config.RGB_565); bitmap.setPixels(pixelsBuffer, screenshotSize - widthx, -widthx, 0, 0, widthx, heightx); pixelsBuffer = null; short sBuffer[] = new short[screenshotSize]; ShortBuffer sb = ShortBuffer.wrap(sBuffer); bitmap.copyPixelsToBuffer(sb); // Making created bitmap (from OpenGL points) compatible with // Android bitmap for (int i = 0; i < screenshotSize; ++i) { short v = sBuffer[i]; sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11)); } sb.rewind(); bitmap.copyPixelsFromBuffer(sb); InCallActivity.captureBmp = bitmap.copy( Bitmap.Config.ARGB_8888, false); InCallActivity.capture = false; } 

Я помещаю этот код в onDrawFrame(GL10 gl) моего class Renderer , и кажется, что он работает. Здесь InCallActivity – это класс, в котором я использую GlSurfaceView. Я получил этот ответ по этой ссылке . Спасибо за поддержку. Счастливое кодирование 🙂

Вы можете попробовать что-то подобное

 Bitmap bitmap; View v1 = findViewById(R.id.rlid);// get ur root view id v1.setDrawingCacheEnabled(true); bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); 

А затем для сохранения

 ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg") f.createNewFile(); FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); fo.close(); 

Источник: как программно сделать снимок экрана и сохранить его в галерее?

Или вы также можете проверить эту ссылку. Как программно сделать снимок экрана в Android?