Android prend la capture d’écran par programmation

Tout d’abord, j’écris une application racine, donc les permissions root ne posent aucun problème. J’ai cherché et cherché et trouvé beaucoup de code qui n’a jamais fonctionné pour moi, voici ce que j’ai reconstitué jusqu’ici et qui fonctionne. Quand je dis sorta, je veux dire qu’il crée une image sur /sdcard/test.png, mais le fichier est à 0 octet et ne peut évidemment pas être visualisé.

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(); } } } 

Toute aide sur la façon dont je peux prendre une capture d’écran dans Android via le code serait grandement appréciée merci!

=== EDIT ===

Ce qui suit est tout ce que j’utilise l’image est faite sur ma carte SD et n’est plus 0 octets mais la chose entière est noire il n’y a rien dessus. J’ai lié l’activité à mon bouton de recherche alors quand je suis sur mon téléphone, j’appuie longtemps sur search et il est censé prendre une capture d’écran, mais je reçois juste une image noire? Tout est mis en transparence donc je pense que ça devrait prendre tout ce qui est à l’écran mais je continue à avoir du noir

Manifeste

       

XML

    

Classe de capture d’écran

 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(); Ssortingng extr = Environment.getExternalStorageDirectory().toSsortingng(); 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(); } } 

Ici vous allez … j’ai utilisé ceci:

 View v = view.getRootView(); v.setDrawingCacheEnabled(true); Bitmap b = v.getDrawingCache(); Ssortingng extr = Environment.getExternalStorageDirectory().toSsortingng(); File myPath = new File(extr, getSsortingng(R.ssortingng.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 iz la disposition de la racine … juste pour pointer;)))

Pour le prochain lecteur de cette question-

La manière très simple de le faire en dessinant votre vue sur

passez votre référence de disposition principale à cette méthode-

  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; } 

Je pense que vous devez attendre que la mise en page soit complètement dessinée. Utilisez ViewTreeObserver pour recevoir un rappel lorsque la mise en page est complètement dessinée.

Sur votre onCreate, ajoutez ce code .. Appelez seulement getScreen depuis l’intérieur de onGlobalLayout ().

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

J’ai posé une question un peu similaire une fois .. S’il vous plaît voir ma question qui explique la façon de prendre une capture d’écran dans Android..Hope cela aide

 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); } } } 

n’oublie pas de donner l’autorisation d’écriture externe en écriture!

Vous prenez une capture d’écran comme celle-ci ……..

 View view = findViewById(R.id.rellayout); view.getRootView(); Ssortingng 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(); Ssortingng 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 { } 

Mon problème était avec “TargetApi (23)” qui est nécessaire si votre minSdkVersion est en dessous de 23.

Donc, j’ai la permission de demander l’extrait suivant

 protected boolean shouldAskPermissions() { return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1); } @TargetApi(23) protected void askPermissions() { Ssortingng[] 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(); } }