簡體   English   中英

Android使用MediaProjectionManager截屏,OnImageAvailable無法啟動

[英]Android taking a screenshot with MediaProjectionManager, OnImageAvailable doesn't start

我正在開發一個android項目,其中在其他應用程序的頂部也有一個疊加按鈕,當單擊此按鈕時,應該截圖。 覆蓋按鈕有效,但屏幕截圖部分無效。 我不知道為什么,但是似乎OnImageAvailable沒有啟動。 這是一個單獨的項目,我僅在其中測試屏幕截圖部分:

public class MainActivity extends Activity {

private static final int REQUEST_CODE= 100;

private MediaProjectionManager mProjectionManager;
private MediaProjection mProjection;
private ImageReader mImageReader;
private Handler mHandler = new Handler(Looper.getMainLooper());
private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // call for the projection manager
    mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

    imageView = (ImageView) findViewById(R.id.imageView);

    // start projection
    final Button startButton = (Button)findViewById(R.id.button);
    startButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startProjection();
        }
    });

    // start capture handling thread
    new Thread() {
        @Override
        public void run() {
            Looper.prepare();
            mHandler = new Handler();
            Looper.loop();
        }
    }.start();

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE) {

        mProjection = mProjectionManager.getMediaProjection(resultCode, data);

        if (mProjection != null) {
            final DisplayMetrics metrics = getResources().getDisplayMetrics();
            final int density = metrics.densityDpi;
            final int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
            final Display display = getWindowManager().getDefaultDisplay();
            final Point size = new Point();
            display.getSize(size);
            final int width = size.x;
            final int height = size.y;

            mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 2);
            mProjection.createVirtualDisplay("screencap", width, height, density, flags, mImageReader.getSurface(), null, mHandler);
            mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {

                @Override
                public void onImageAvailable(ImageReader reader) {
                    Image image = null;
                    Bitmap bitmap = null;

                    try {
                        image = mImageReader.acquireLatestImage();
                        if (image != null) {
                            final Image.Plane[] planes = image.getPlanes();

                            int width = image.getWidth();
                            int height = image.getHeight();
                            int pixelStride = planes[0].getPixelStride();
                            int rowStride = planes[0].getRowStride();
                            int rowPadding = rowStride - pixelStride * width;
                            byte[] newData = new byte[width*height*4];

                            int offset = 0;
                            bitmap = Bitmap.createBitmap(metrics, width, height, Bitmap.Config.ARGB_8888);
                            ByteBuffer buffer = planes[0].getBuffer();
                            for(int i = 0; i < height; ++i){
                                for(int j = 0; j < width; ++j){
                                    int pixel = 0;
                                    pixel |= (buffer.get(offset) & 0xff) << 16;     // R
                                    pixel |= (buffer.get(offset + 1) & 0xff) << 8;  // G
                                    pixel |= (buffer.get(offset + 2) & 0xff);       // B
                                    pixel |= (buffer.get(offset + 3) & 0xff) << 24; // A
                                    bitmap.setPixel(j, i, pixel);
                                    offset += pixelStride;
                                }
                                offset += rowPadding;
                            }

                            imageView.setImageBitmap(bitmap);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {

                        if (bitmap!=null)
                            bitmap.recycle();

                        if (image!=null)
                            image.close();

                    }
                }

            }, mHandler);
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}

private void startProjection() {
    startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
}

}

我認為您應該設置其他標志。 您是在告訴MediaProjection僅顯示其自身內容,但沒有在其表面上繪制任何內容。 要制作屏幕截圖,您必須使用“ DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR”標志來復制不同的顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM