captura de pantalla de Android de la página fuera de pantalla

Estoy trabajando en una aplicación de Android. Tengo una actividad, digamos A, que llena toda la pantalla con vistas. Con un botón, haga clic en AI para iniciar otra actividad, digamos B, que también tiene algunas vistas y controles. Quiero que la actividad B sea fuera de pantalla, y quiero tomar la captura de pantalla de B de A. ¿Es posible?

Nota: Tengo éxito en tomar la captura de pantalla de la página A guardando el caché de dibujo en un bitmap, pero luchando por tomar la captura de pantalla de la página fuera de pantalla.

Sí, es posible … Debería ampliar ActivityGroup en la Actividad ‘A’. Luego haga esto en su evento de clic de botón …

View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView(); 

luego convierta esa vista como bitmap …

Creo que esto es útil para ti …

Bueno, he logrado lo que quiero. Estos son los pasos que utilicé.

  1. Inicie la actividad B con startActivityForResult () en lugar de startActivity ().

     Intent bIntent = new Intent(A.this,B.class); startActivityForResult(bIntent,B_REQUEST_CODE); 
  2. En onCreate of activity B, toma mainLayout of B y habilita su caché de dibujo

     final LinearLayout layout = (LinearLayout) findViewById(R.id.app_parent_layout); layout.setDrawingCacheEnabled(true); layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH); 
  3. En la actividad B espera hasta que su diseño se dibuje por completo (Esto es muy importante). Para eso en onCreate () de actividad B, obtenga mainLayout de B, use ViewTreeObserver para obtener una callback cuando su diseño se dibuje por completo.

     ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); getDrawingBitmap(); } }); 
  4. Ahora se llama a getDrawingBitmap () cuando el diseño se dibuja por completo. Toma tu captura de pantalla.

     public void getDrawingBitmap(){ LinearLayout mainLayout = (LinearLayout) findViewById(R.id.app_parent_layout); Bitmap b = mainLayout.getDrawingCache(); File file = saveBitmapAsFile(b); Intent resultIntent = new Intent(); resultIntent.putExtra("FullFileName",file.getAbsolutePath()); setResult(Activity.RESULT_OK,resultIntent); finish(); } 

    Aquí estoy tomando bitmap y guardándolo como un archivo y devolviendo el nombre del archivo como código de resultado. Estoy seguro de que hay un mejor método para enviar el bitmap a la actividad principal que guardar como un archivo y enviar un nombre de archivo. Pero de todos modos, tengo un requisito para guardar bitmap por algún tiempo. Entonces para mí este es el método más fácil. Después de establecer la actividad de finalización del resultado.

  5. Ahora, en la Actividad A onActivityResult () recuperar el nombre del archivo.

     public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == B_REQUEST_CODE){ if (resultCode == Activity.RESULT_OK) { String newText = data.getStringExtra("FullFileName"); File dir = new File (newText); } } } 

Creo que sería muy difícil hacerlo, ya que no sé cómo controlar los métodos de dibujo de esas vistas, y el sistema operativo Android tampoco los dibujará a menos que sean visibles.

Sin embargo, es posible poner en primer plano la otra Vista por solo un corto tiempo para llenar su caché de dibujo. Tal vez se pueda volver a poner el fondo antes de que se vuelva visible, ya que para una experiencia fluida, el sistema operativo parece dibujar vistas fuera de la pantalla antes de que se comprendan en primer plano.

Otro truco podría ser adjuntar su vista en primer plano como Vista secundaria al fondo, y darle una transparencia alfa muy leve. El WebView, por ejemplo, se puede superponer de esta manera muy bien, lo que realmente obliga a dibujar tanto el WebView como su fondo. Quizás esto también funciona con otras Vistas.

Estoy usando de esta forma su funcionamiento excelente, pero hay un problema: solo tomo instantáneas de un diseño. La primera vez que tomo el snapshoot, me da la imagen de la derecha, pero después de algunos cambios lo vuelvo a tomar, me da una instantánea previa.

 RelativeLayout layout = (RelativeLayout)findViewById(R.id.mainview); layout.setDrawingCacheEnabled(true); layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH); layout.buildDrawingCache(); Bitmap bitmap = layout.getDrawingCache(); File file = new File(Environment.getExternalStorageDirectory().toString() + "/sPenimg.png"); FileOutputStream ostream; try { ostream = new FileOutputStream(file); bitmap.compress(CompressFormat.PNG, 100, ostream); ostream.flush(); ostream.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Este problema está resuelto para agregar ((RelativeLayout) findViewById (R.id.mainview)). DestroyDrawingCache ();