Wie kann ich einen Screenshot von Android Surface View machen?

Ich möchte programmatisch einen Screenshot von meinem Spiel machen, so wie du in Eclipse DDMS bekommen würdest.

Screenshot durch die hier vorgeschlagene Lösung: Wie programmgesteuert man einen Screenshot in Android? Und in den meisten anderen SO-Fragen haben nur View-Elemente sichtbar, aber nicht die SurfaceView.

  • Ich kann keine adb_usb.ini Datei im .android Ordner finden?
  • Android: Wie bekomme ich einen Inhalt: // URI für eine Datei im externen Speicher PUBLIC Verzeichnis
  • Android IntentService kann die Klasse nicht instanziieren. Kein leerer Konstruktor
  • So stellen Sie den Text ein, um aus dem Schubladen-Header-Layout in der Navigationsschublade ohne Aufblasansicht zu sehen
  • Gibt es eine Android PCI Karte?
  • Wie viele AsyncTasks kann ich in einer einzigen Prozessanwendung ausführen
  • SCREENSHOTS_LOCATIONS = Environment.getExternalStorageDirectory().toString() + "/screenshots/"; // Get root view View view = activity.getWindow().getDecorView().getRootView(); // Create the bitmap to use to draw the screenshot final Bitmap bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); // Get current theme to know which background to use final Theme theme = activity.getTheme(); final TypedArray ta = theme .obtainStyledAttributes(new int[] { android.R.attr.windowBackground }); final int res = ta.getResourceId(0, 0); final Drawable background = activity.getResources().getDrawable(res); // Draw background background.draw(canvas); // Draw views view.draw(canvas); // Save the screenshot to the file system FileOutputStream fos = null; try { final File sddir = new File(SCREENSHOTS_LOCATIONS); if (!sddir.exists()) { sddir.mkdirs(); } fos = new FileOutputStream(SCREENSHOTS_LOCATIONS + System.currentTimeMillis() + ".jpg"); if (fos != null) { if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos)) { Log.d("ScreenShot", "Compress/Write failed"); } fos.flush(); fos.close(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

    Jede Hilfe in dieser Hinsicht wäre sehr geschätzt. Vielen Dank.

  • Implementieren von SearchView gemäß den Materialentwurfsrichtlinien
  • Fehler beim Freigeben von APK mit AsyncTask und Jsoup
  • Fehler: (31, 0) Gradle DSL-Methode nicht gefunden: 'jniDebugBuild ()'
  • ACCESS_COARSE_LOCATION-Berechtigung gibt eine Zellenturm-Präzision auf Android
  • Wie kann man Dokumente (.pdf, .doc) ohne externe App öffnen / anzeigen?
  • Soll ich ActionBarSherlock für Android 4.0+ Apps verwenden?
  • 3 Solutions collect form web for “Wie kann ich einen Screenshot von Android Surface View machen?”

    Ich hoffe das ist auch für dich nützlich. Hier wenig Unterschied für die obige Antwort ist für ich verwendet glsurfaceview, um die Screenshots zu nehmen, wenn ich auf den Button klicke. Dieses Bild wird in sdcard für den angegebenen Ordner gespeichert: sdcard / emuliert / 0 / printerscreenshots / image / … images

      My Program : View view_storelayout ; view_storelayout = findViewById(R.id.gl_surface_view); button onclick() { view_storelayout.setDrawingCacheEnabled(true); view_storelayout.buildDrawingCache(true); Bitmap bmp = Bitmap.createBitmap(view_storelayout.getDrawingCache()); view_storelayout.setDrawingCacheEnabled(false); // clear drawing cache ByteArrayOutputStream bos = new ByteArrayOutputStream(); bmp.compress(CompressFormat.JPEG, 90, bos); byte[] bitmapdata = bos.toByteArray(); ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata); final Calendar c=Calendar.getInstance(); long mytimestamp=c.getTimeInMillis(); String timeStamp=String.valueOf(mytimestamp); String myfile="hari"+timeStamp+".jpeg"; dir_image=new File(Environment.getExternalStorageDirectory()+ File.separator+"printerscreenshots"+File.separator+"image"); dir_image.mkdirs(); try { File tmpFile = new File(dir_image,myfile); FileOutputStream fos = new FileOutputStream(tmpFile); byte[] buf = new byte[1024]; int len; while ((len = fis.read(buf)) > 0) { fos.write(buf, 0, len); } fis.close(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(getApplicationContext(), "myPath:" +dir_image.toString(), Toast.LENGTH_SHORT).show(); Log.v("hari", "screenshots:"+dir_image.toString()); } Note : But, here i am faced one problem. In this surfaceview , i drawn line and circle at runtime. after drawn some objects, when i take screenshots , its stored only for black image like surfaceview is stored as an image. And also i want to store that surfaceview image as an .dxf format(autocad format). i tried to stored image file as an .dxf file format.its saved successfully in autocad format. but, it cant open in autocad software to edit my .dxf file. 

    Hope This Snippet kann Ihnen helfen

      View v= getRootView(); v.setDrawingCacheEnabled(true); // this is the important code :) // Without it the view will have a dimension of 0,0 and the bitmap will be null v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); v.layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); v.buildDrawingCache(true); Bitmap bitmap =v.getDrawingCache(); path=Environment.getExternalStorageDirectory() + "/test.png"; File file = new File(path); try { file.createNewFile(); FileOutputStream ostream = new FileOutputStream(file); bitmap.compress(CompressFormat.PNG, 100, ostream); ostream.close(); } catch (Exception e) { e.printStackTrace(); } 

    Der Code aus der Usman Kurd Antwort wird nicht funktionieren ist die meisten Fälle.

    Es sei denn, du machst H.264-Videorahmen in Software mit Canvas auf eine Ansicht, der Draw-Cache-Ansatz wird nicht funktionieren (siehe zB diese Antwort).

    Sie können keine Pixel aus dem Oberflächenteil der SurfaceView lesen. Das Grundproblem ist, dass eine Oberfläche eine Warteschlange von Puffern mit einer Hersteller-Consumer-Schnittstelle ist und Ihre App auf der Produzenten-Seite ist. Der Verbraucher, in der Regel der System-Compositor (SurfaceFlinger), ist in der Lage, einen Screenshot zu erfassen, weil es am anderen Ende der Pipe ist.

    Nehmen Sie Screenshot von SurfaceView

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.