[TR] Android'de VideoView'den ekran görüntüsü alma

Mon, Aug 24, 2015 3-minute read

Normalde Android’de herhangi bir view’in ekran görüntüsünü almak çok basit ancak VideoView ile bunu yapmak imkansız(mış). Sorunun kaynağı VideoView sınıfının SurfaceView’ın çocuk sınıfı olmasında. Kaynaklara göre SurfaceView görüntüleri ekrana yazılımsal değil donanımsal olarak çiziyor (muhtemelen performans nedeni ile). Bu nedenle yazılımsal olarak araya girilip ekranın görüntüsü alınamıyor. Bir sürü uğraşın ardından VideoView’dan ekran görüntüsü alamayacağımı anladım ve tam bir sorumlu yazılımcının yapacağı gibi meseleyi oluruna bıraktım (amaan burdan da ekran görüntüsü almayıverelim canım). Bir süre başka konularla ilgilendikten sonra ekran görüntüsü alamama probleminin başıma bela olacağını anladım ve tekrar araştırmaya başladım. Daha sonra TextureView ile tanıştım. Bu TextureView, SurfaceView’in gürüntüyü yazılımsal olarak çizeni imiş. Biraz kurcaladıktan sonra TextureView kullanarak video oynatmayı ve ardından ekran görüntüsü almayı başardım. İşte kanıtı: SurfaceView’in alt sınıfı olmayan View’den ekran görüntüsü almak;

    Bitmap bitmap;
    view.setDrawingCacheEnabled(true);
    bitmap = Bitmap.createBitmap(view.getDrawingCache());
    view.setDrawingCacheEnabled(false);

TextureView ile video oynatmak ve screenshot almak;

public class TextureVideoActivity extends Activity implements TextureView.SurfaceTextureListener {
    private static final String FILE_NAME = "myVideo.mp4";
    private static final String TAG = TextureVideoActivity.class.getName();
    private MediaPlayer mMediaPlayer;
    private TextureView mPreview;

    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);
        setContentView(R.layout.activity_texture_video);

        mPreview = (TextureView) findViewById(R.id.textureView);
        mPreview.setSurfaceTextureListener(this);

    }

    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
        Surface surface = new Surface(surfaceTexture);
        try {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer
                    .setDataSource(this, Uri.parse(FILE_NAME));
            mMediaPlayer.setSurface(surface);
            mMediaPlayer.setLooping(true);

            // don't forget to call MediaPlayer.prepareAsync() method when you use constructor for
            // creating MediaPlayer
            mMediaPlayer.prepareAsync();
            // Play video when the media source is ready for playback.
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.start();
                }
            });
        } catch (IllegalArgumentException e) {
            Log.d(TAG, e.getMessage());
        } catch (SecurityException e) {
            Log.d(TAG, e.getMessage());
        } catch (IllegalStateException e) {
            Log.d(TAG, e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, e.getMessage());
        }
    }
    public File saveScreenShot() {
            Toast.makeText(getContext(), "Screenshot Button Clicked!",
                    Toast.LENGTH_LONG).show();
            Bitmap b;
            b = getBitmap();
            File folder = new File(Environment.getExternalStorageDirectory().getPath() + "/snapfy");
            if (!folder.exists()) {
                folder.mkdir();
            }
            SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
            Date now = new Date();
            String strDate = sdfDate.format(now);
            String path = folder.getAbsolutePath() + "/snapfyshot-" + strDate + ".jpg";
            File myPath = new File(path);
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(myPath);
                b.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                fos.flush();
                fos.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return myPath;
        }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            // Make sure we stop video and release resources when activity is destroyed.
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) {
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
    }
}