无法使用android中的mediaprojection api创建虚拟显示以进行屏幕截图捕获

时间:2017-09-26 13:14:50

标签: android screenshot android-mediaprojection

我尝试使用MediaProjection API捕获屏幕截图,但不知何故得到此错误。 我的代码如下:

public  void startProjection()
{
    setScreenSize();
    MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
    startActivityForResult(projectionManager.createScreenCaptureIntent(), PERMISSION_CODE);
}

和onActivityResult是我在CREATEVIRTUALDISPLAY方法调用中出错的部分

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if(resultCode==RESULT_OK)
            {
                MediaProjectionManager manager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

                mediaProjection = manager.getMediaProjection(PERMISSION_CODE, data);
                imageReader = ImageReader.newInstance(mWidth, mHeight,ImageFormat.JPEG, 2);

                DisplayMetrics metrics = getResources().getDisplayMetrics();
                int  mDensity = metrics.densityDpi;
                int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;

                mediaProjection.createVirtualDisplay("screen-mirror", mWidth,mHeight,mDensity, flags, imageReader.getSurface(), null, null);

                Image image = imageReader.acquireLatestImage();
                final Image.Plane[] planes = image.getPlanes();
                final ByteBuffer buffer = planes[0].getBuffer();
                int offset = 0;
                int pixelStride = planes[0].getPixelStride();
                int rowStride = planes[0].getRowStride();
                int rowPadding = rowStride - pixelStride * mWidth;
    // create bitmap
                Bitmap bmp = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.RGB_565);
                bmp.copyPixelsFromBuffer(buffer);
                image.close();
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

                File f = new File(Environment.getRootDirectory()
                        + File.separator + "MediaProctions" + File.separator + "test_" + Math.random() + ".jpg");
                try {
                    f.createNewFile();
                    FileOutputStream fo = new FileOutputStream(f);
                    fo.write(bytes.toByteArray());
                    fo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

错误日志:

09-26 18:38:29.574 9161-9161/com.andi.shikharshah.fileobserver E/AndroidRuntime: FATAL EXCEPTION: main
                                                                             Process: com.andi.shikharshah.fileobserver, PID: 9161
                                                                             java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=123, result=-1, data=Intent { (has extras) }} to activity {com.andi.shikharshah.fileobserver/com.andi.shikharshah.fileobserver.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.display.VirtualDisplay android.media.projection.MediaProjection.createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler)' on a null object reference
                                                                                 at android.app.ActivityThread.deliverResults(ActivityThread.java:5002)
                                                                                 at android.app.ActivityThread.handleSendResult(ActivityThread.java:5045)
                                                                                 at android.app.ActivityThread.access$1600(ActivityThread.java:229)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                 at android.os.Looper.loop(Looper.java:148)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:7329)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.display.VirtualDisplay android.media.projection.MediaProjection.createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler)' on a null object reference
                                                                                 at com.andi.shikharshah.fileobserver.MainActivity.onActivityResult(MainActivity.java:90)
                                                                                 at android.app.Activity.dispatchActivityResult(Activity.java:7165)
                                                                                 at android.app.ActivityThread.deliverResults(ActivityThread.java:4998)
                                                                                 at android.app.ActivityThread.handleSendResult(ActivityThread.java:5045) 
                                                                                 at android.app.ActivityThread.access$1600(ActivityThread.java:229) 
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875) 
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                 at android.os.Looper.loop(Looper.java:148) 
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:7329) 
                                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我已经尝试了很多方法来调试和检查,但我看到的只是正确的代码和变量,请引导我完成这个。

0 个答案:

没有答案