Android开发 之 截屏和录屏

截屏和录屏

方案:在5.0以前,对于开发者是不能实现的,要root权限,使用adb命令录制,显然不能应用于应用开发上。
在5.0出现了MediaProjection和VirtualDisplay这两类就可以做到了

下面就看看开发步奏:
1. 添加权限:录音权限,读写sd卡权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

2.获取MediaProjectionManager系统服务,请求授予权限
mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(),PERMISSION_CODE);

3.得到用户权限后在onActivityResult中处理
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode != PERMISSION_CODE) {
            Log.e("hello", "Unknown request code: " + requestCode);
            return;
        }
        if (resultCode != RESULT_OK) {
            Toast.makeText(this,
                    "User denied screen sharing permission", Toast.LENGTH_SHORT).show();
            return;
        }
        mMediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
        mMediaProjection.registerCallback(new MediaProjectionCallback(), null);
    }
在这里获取的MediaProjection对象,注册监听
    private class MediaProjectionCallback extends MediaProjection.Callback {
        @Override
        public void onStop() {
            if (mVirtualDisplay != null) {
                mVirtualDisplay.release();
                mVirtualDisplay = null;
            }
        }
    }
这里就分支了,你是要截图呢,还是要录制视频呢
如果截图的话,需呀使用ImageReader类
初始化ImageReader对象
        imageReader = ImageReader.newInstance(activity.width, activity.height, PixelFormat.RGBA_8888, 2);
调用自己写的这个方法得到VirtualDisplay对象,把数据源设置到imageReader.getSurface()中
 public VirtualDisplay createVirtualDisplay(Surface surface,int width,int height) {
        mVirtualDisplay = mMediaProjection.createVirtualDisplay("JieTu",
                width, height, mScreenDensity,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                surface, null /*Callbacks*/, null /*Handler*/);
        return mVirtualDisplay;
    }
第一个参数是显示在组件,第二第三个是显示的宽高

点击调用下面方法截图,做了一个动画效果
public void startCapture()
    {
        Image image = imageReader.acquireLatestImage();
        int width = image.getWidth();
        int height = image.getHeight();
        Image.Plane[] planes = image.getPlanes();
        ByteBuffer buffer = planes[0].getBuffer();
        int pixelStride = planes[0].getPixelStride();
        int rowStride = planes[0].getRowStride();
        int i = rowStride - pixelStride * width;
        Bitmap bitmap = Bitmap.createBitmap(width + i / pixelStride, height, Bitmap.Config.ARGB_8888);
        bitmap.copyPixelsFromBuffer(buffer);
        Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, width, height);
        image.close();
        imagecopy.setImageBitmap(bitmap1);
        imagecopy.setVisibility(View.VISIBLE);
        PropertyValuesHolder holder = PropertyValuesHolder.ofFloat("scaleX", 1, 0.8f,0.8f,0.8f,0.8f);
        PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleY", 1, 0.8f,0.8f,0.8f,0.8f);
        PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("alpha", 1, 1,1,1,0);
        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imagecopy, holder, holder1,holder2);
        objectAnimator.setDuration(2000);
        objectAnimator.setInterpolator(new DecelerateInterpolator());
        objectAnimator.start();
        objectAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                imagecopy.setVisibility(View.GONE);
                MyToast.makeText(getContext(),"截图成功");
            }
        });
//
//        imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
//            @Override
//            public void onImageAvailable(ImageReader imageReader2) {
//
//            }
//        },null);
    }


若果你要录屏的话:
这里录制视屏用到MediaRecorder
public void initMediaRecorder()
    {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频源;
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);//设置视频源;
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置视频输出格式;
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置视频编码格式;
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码格式。
        mediaRecorder.setVideoEncodingBitRate(512*1000);//设置视频编码的码率;
        mediaRecorder.setVideoFrameRate(30);//设置视频编码的帧率;
        mediaRecorder.setVideoSize(500,900);
        mediaRecorder.setOutputFile("/sdcard/capture.mp4");
        try {
            mediaRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
                virtualDisplay2 = createVirtualDisplay(mediaRecorder.getSurface(), 500, 900);
                mediaRecorder.start();
这样就开始录制了
                mediaRecorder.stop();
                mediaRecorder.reset();
                virtualDisplay2.release();

停止录制,释放资源






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值