Ich habe eine App mit dem folgenden LayoutAndroid: Unter Screenshot aller Ansichten auf dem Display
- SurfaceHolder
- Surface
- CameraPreview
- Ansicht (dumme Gläser)
Alle Ich möchte ein Foto/Schnappschuss von diesem machen und es betrachten, scheinen bonkers/Komplex
Ich habe zuerst einen Schnappschuss von der Oberfläche gemacht und ein schwarzes Quadrat bekommen, es scheint, dass diese Methode falsch ist
Jetzt verwende ich MediaProjection/ImageReader?
Update: So bekomme ich ein Bild aber von Wellenlinien und es stürzt ab, weil ich versuche, die MediaProjection zu stoppen. Wie gesagt alles, was ich tun möchte, ist ein einzelnes Bild nehmen
private void saveImage()
{
final Handler mHandler = new Handler();
final ImageReader mImageReader = ImageReader.newInstance(cameraSurface.getWidth(), cameraSurface.getHeight(), PixelFormat.RGBA_8888, 2);
mProjection.createVirtualDisplay("screen-mirror", cameraSurface.getWidth(), cameraSurface.getHeight(), mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
FileOutputStream fos = null;
Bitmap bitmap = null;
try {
image = mImageReader.acquireLatestImage();
fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/myscreen.jpg");
final Image.Plane[] planes = image.getPlanes();
final Buffer buffer = planes[0].getBuffer().rewind();
bitmap = Bitmap.createBitmap(cameraSurface.getWidth(), cameraSurface.getHeight(), Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
//MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Title" , "Desc");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos!=null) {
try {
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
if (bitmap!=null)
bitmap.recycle();
if (image!=null)
image.close();
if (mProjection!=null) {
mProjection.stop();
mImageReader.close();
}
}
}
}, mHandler);
}