web-dev-qa-db-fra.com

Android prendre une capture d'écran par programme

Tout d'abord, j'écris une application racine, donc les autorisations root ne sont pas un problème. J'ai cherché et cherché et trouvé beaucoup de code qui n'a jamais fonctionné pour moi ici, c'est ce que j'ai rassemblé jusqu'à présent et ça fonctionne. Quand je dis sorta, je veux dire que cela fait une image sur mon /sdcard/test.png mais le fichier est de 0 octet et ne peut évidemment pas être affiché.

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 en 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 le tout est noir il n'y a rien dessus. J'ai lié l'activité à mon bouton de recherche, donc lorsque je suis sur mon téléphone, j'appuie longuement sur la recherche et il est censé prendre une capture d'écran, mais je reçois juste une image noire? Tout est transparent, donc je pense qu'il devrait saisir tout ce qui est à l'écran mais je continue de devenir noir

Manifest

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

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

Et voilà ... j'ai utilisé ceci:

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 iz disposition racine ... juste pour pointer;)))

26
Jovan

Pour le prochain lecteur de cette question-

La façon très simple de le faire en dessinant votre vue sur toile-

passez votre référence de mise en page 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;
   }
4
Tarun Varshney
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'oubliez pas de donner la permission d'écrire sur le stockage externe!

1
Mayur R. Amipara

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

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

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

J'ai posé une question quelque peu similaire question une fois..Veuillez voir ma question qui explique la façon de prendre une capture d'écran dans Android..J'espère que cela aide

1
Krishnabhadra

Vous prenez une capture d'écran comme ceci ........

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 {


        }
0
Singhak