2011-10-14 24 views
44

Primero estoy escribiendo una aplicación raíz para que los permisos de raíz no sean un problema. He buscado y buscado y he encontrado un montón de código que nunca funcionó para mí. Es lo que he reconstruido hasta ahora y funciona. Cuando digo sorta me refiero a que hace una imagen en mi /sdcard/test.png, sin embargo, el archivo tiene 0 bytes y obviamente no se puede ver.Android tome la captura de pantalla programáticamente

public class ScreenShot extends Activity{ 

View content; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.blank); 
    content = findViewById(R.id.blankview); 
    getScreen(); 
} 

private void getScreen(){ 
    Bitmap bitmap = content.getDrawingCache(); 
    File file = new File("/sdcard/test.png"); 
    try 
    { 
     file.createNewFile(); 
     FileOutputStream ostream = new FileOutputStream(file); 
     bitmap.compress(CompressFormat.PNG, 100, ostream); 
     ostream.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

Cualquier ayuda sobre cómo puedo tomar una captura de pantalla en el código de Android sería muy apreciada gracias!

=== === EDITAR

El siguiente es todo lo que estoy usando la imagen está tomada en mi tarjeta sd y no es 0Bytes más largos, pero toda la cosa es negro no hay nada en él. He vinculado la actividad a mi botón de búsqueda, así que cuando estoy en algún lugar de mi teléfono, presiono durante mucho tiempo la búsqueda y se supone que debe tomar una captura de pantalla, pero acabo de obtener una imagen en negro. Todo está listo transparente, de modo que lo pensaría que debería agarrar lo que está en la pantalla, pero cada vez me siento negro

Manifiesto

<activity android:name=".extras.ScreenShot" 
    android:theme="@android:style/Theme.Translucent.NoTitleBar" 
    android:noHistory="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH_LONG_PRESS" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    </activity> 

XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00000000" 
    android:id="@+id/screenRoot">  
</LinearLayout> 

clase de pantalla

public class ScreenShot extends Activity{ 

View content; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screenshot); 
    content = findViewById(R.id.screenRoot); 
    ViewTreeObserver vto = content.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
     content.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     getScreen(); 
     } 
    }); 
} 

private void getScreen(){ 
    View view = content; 
    View v = view.getRootView(); 
    v.setDrawingCacheEnabled(true); 
    Bitmap b = v.getDrawingCache();    
    String extr = Environment.getExternalStorageDirectory().toString(); 
    File myPath = new File(extr, "test.jpg"); 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(myPath); 
     b.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     fos.flush(); 
     fos.close(); 
     MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen"); 
    }catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finish(); 
} 
} 

Respuesta

1

yo creo que hay que esperar hasta que el diseño se dibuja completely..Use ViewTreeObserver para obtener una devolución de llamada cuando el diseño se dibuja por completo ..

En sus alcrear añadir esta llamada code..Only getScreen desde el interior onGlobalLayout() ..

ViewTreeObserver vto = content.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
    content.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    getScreen(); 
    } 
}); 

me preguntó un tanto similar question once..Please ver mi pregunta lo que explica la manera de tomar captura de pantalla en android..Hope esto ayuda

+0

k gracias por la respuesta va a echar un vistazo a su pregunta mañana muy cansados ​​por el momento. Tengo otra pregunta, ¿cómo no se llama a root cuando hago esto? y este código solo tomará una captura de pantalla del diseño solo porque básicamente quiero tomar una captura de pantalla de lo que hay en la pantalla. Lo tengo vinculado a la tecla de búsqueda cuando presiona largamente – user577732

+0

Ok. Funciona bien Pero si estoy usando ese código para tomar una captura de pantalla de la vista de cámara, entonces no va a funcionar. –

26

Aquí tienes ... solía esto:

View v = view.getRootView(); 
v.setDrawingCacheEnabled(true); 
Bitmap b = v.getDrawingCache(); 
String extr = Environment.getExternalStorageDirectory().toString(); 
File myPath = new File(extr, getString(R.string.free_tiket)+".jpg"); 
FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(myPath); 
    b.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
    fos.flush(); 
    fos.close(); 
    MediaStore.Images.Media.insertImage(getContentResolver(), b, 
             "Screen", "screen"); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

v diseño raíz iz ... justo a punto;)))

+0

¿Qué es vista? Estoy usando tu código, pero tengo el error de que la vista no se puede resolver. Entonces, ¿qué es vista? –

+0

La vista es LinearLayout ... debe agregar el id a su diseño lineal o relativo (lo que usa) y en onCreate lo define así: Ver view = findViewById (R.id.linearLayoutRoot); entonces y uso el resto de mi código ... – Jovan

+0

Ok Gracias. Entiendo. Y funciona genial Pero necesito algo más de ayuda si puedes. –

0

You Take Screen Shot gusta esta ........

View view = findViewById(R.id.rellayout); 
     view.getRootView(); 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) 
     { 
      File picDir = new File(Environment.getExternalStorageDirectory()+ "/name"); 
      if (!picDir.exists()) 
      { 
       picDir.mkdir(); 
      } 
      view.setDrawingCacheEnabled(true); 
      view.buildDrawingCache(true); 
      Bitmap bitmap = view.getDrawingCache(); 
//   Date date = new Date(); 
      String fileName = "mylove" + ".jpg"; 
      File picFile = new File(picDir + "/" + fileName); 
      try 
      { 
       picFile.createNewFile(); 
       FileOutputStream picOut = new FileOutputStream(picFile); 
       bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));//Optional 
       boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut); 
       if (saved) 
       { 
        Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show(); 
       } else 
       { 
        //Error 
       } 
       picOut.close(); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      view.destroyDrawingCache(); 
     } else { 


     } 
4

Para el próximo lector de pregunta-

La manera muy simple de hacer esto dibujando el fin de Canvas-

pasar su principal referencia la disposición a este método-

Bitmap file = save(layout); 

Bitmap save(View v) 
    { 
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.draw(c); 
    return b; 
    } 
+0

muy agradable, esta es la actualización, pero otras formas de imagen en efectivo y es malo –

1
public class MainActivity extends Activity 
{ 
Button btn; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    btn = (Button) findViewById(R.id.btn); 
    btn.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      // TODO Auto-generated method stub 
      Bitmap bitmap = takeScreenshot(); 
      saveBitmap(bitmap); 

     } 
    }); 
} 

public Bitmap takeScreenshot() 
{ 
    View rootView = findViewById(android.R.id.content).getRootView(); 
    rootView.setDrawingCacheEnabled(true); 
    return rootView.getDrawingCache(); 
} 

public void saveBitmap(Bitmap bitmap) 
{ 
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); 
    FileOutputStream fos; 
    try 
    { 
     fos = new FileOutputStream(imagePath); 
     bitmap.compress(CompressFormat.JPEG, 100, fos); 
     fos.flush(); 
     fos.close(); 
    } 
    catch (FileNotFoundException e) 
    { 
     Log.e("GREC", e.getMessage(), e); 
    } 
    catch (IOException e) 
    { 
     Log.e("GREC", e.getMessage(), e); 
    } 
} 
} 

No se olvidó de dar permiso de escritura de almacenamiento externo!

0

Mi problema era con "TargetApi (23)" que es necesario si su minSdkVersion está debajo de 23.

lo tanto, tengo el permiso solicitud con el siguiente fragmento de

protected boolean shouldAskPermissions() { 
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1); 
} 

@TargetApi(23) 
protected void askPermissions() { 
    String[] permissions = { 
      "android.permission.READ_EXTERNAL_STORAGE", 
      "android.permission.WRITE_EXTERNAL_STORAGE" 
    }; 
    int requestCode = 200; 
    requestPermissions(permissions, requestCode); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
// ... 
    if (shouldAskPermissions()) { 
     askPermissions(); 
    } 
} 
Cuestiones relacionadas