Android5.0屏幕截屏与屏幕录制

一、屏幕截屏

1、屏幕截屏的步骤:

1:通过 getSystemService()得到MediaProjectionManager服务;
2:通过MediaProjectionManager创建一个屏幕捕捉意图;
3:通过startActivityForResult开启该意图;
4:创建ImageReader、MediaProjection对象,然后通过mediaProjection.createVirtualDisplay()创建一个VirtualDisplay对象,并把mImageReader.getSurface()作为createVirtualDisplay()第六个参数;
5: 通过ImageReader.acquireLatestImage()得到Image;通过Image得到Bitmap.createBitmap()的参数;

2、实例代码

通过点击Button,在ImageView中显示截取的屏幕。
界面布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.zjl.jieping.MainActivity"
    android:orientation="vertical"
    android:background="#f00"
    >

    <Button
        android:id="@+id/jieTu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="截图"
        android:textSize="24sp"
        />
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerInside"
        />
</LinearLayout>

Activity:

public class MainActivity extends Activity {

    private Button bt_jietu;
    private ImageView imageView;
    private MediaProjection mediaProjection;
    private VirtualDisplay mVirtualDisplay;
    private MediaProjectionManager mediaProjectionManager;
    private static final int REQUESTRESULT = 0x100;
    private int mWidth;
    private int mHeight;
    private int mScreenDensity;
    private ImageReader mImageReader;
    private LinearLayout ll;

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

    private void initData() {
        mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
        Display display = getWindowManager().getDefaultDisplay();
        mWidth = display.getWidth();
        mHeight = display.getHeight();
        DisplayMetrics outMetric = new DisplayMetrics();
        display.getMetrics(outMetric);
        mScreenDensity = (int) outMetric.density;
        Intent intent = new Intent(mediaProjectionManager.createScreenCaptureIntent());
        startActivityForResult(intent,REQUESTRESULT);
    }

    private void initView() {
        bt_jietu = (Button) this.findViewById(R.id.jieTu);
        bt_jietu.setOnClickListener(new MyOnClickListener());
        imageView = (ImageView) this.findViewById(R.id.imageView);
        ll = (LinearLayout) this.findViewById(R.id.ll);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            mImageReader = ImageReader.newInstance(mWidth,mHeight, PixelFormat.RGBA_8888, 2);
            mediaProjection = mediaProjectionManager.getMediaProjection(resultCode,data);
            mVirtualDisplay = mediaProjection.createVirtualDisplay("mediaprojection",mWidth,mHeight,
                    mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mImageReader.getSurface(),null,null);

        }
    } 

    private final class MyOnClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            Image image = mImageReader.acquireLatestImage();
            int width = image.getWidth();
            int height = image.getHeight();
            final Image.Plane[] planes = image.getPlanes();
            final ByteBuffer buffer = planes[0].getBuffer();
            int pixelStride = planes[0].getPixelStride();
            int rowStride = planes[0].getRowStride();
            int rowPadding = rowStride - pixelStride * width;
            Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height,
                    Bitmap.Config.ARGB_8888);
            bitmap.copyPixelsFromBuffer(buffer);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height);
            image.close();
            imageView.setImageBitmap(bitmap);
            ll.setBackgroundColor(0x0f0);
        }
    }
}

3、注意

Android屏幕录制存在漏洞:可以查看该博客 Android中利用5.0系统屏幕录制UI漏洞骗取应用录制屏幕授权

二、屏幕录制

屏幕录制与屏幕截屏的布置大致相同;同样也需要使用MediaProjection、VirtualDisplay,不过它还需要MediaRecorder;不在需要ImageReader而已!

1、屏幕录制的步骤:

1:通过 getSystemService()得到MediaProjectionManager服务;
2、创建MediaRecorder对象,并把音视频的编码、输出方式设置好(有时我们可能会遇到设置音频后,程序运行会报错!); 准备录制;
2:通过MediaProjectionManager创建一个屏幕捕捉意图;
3:通过startActivityForResult开启该意图;
4:创建MediaProjection对象,然后通过mediaProjection.createVirtualDisplay()创建一个VirtualDisplay对象,并把mMediaRecorder.getSurface()作为createVirtualDisplay()第六个参数;

2、实例代码

初始化MediaRecorder

    /**
         *  视频编码格式:default,H263,H264,MPEG_4_SP
            获得视频资源:default,CAMERA
            音频编码格式:default,AAC,AMR_NB,AMR_WB
            获得音频资源:defalut,camcorder,mic,voice_call,voice_communication,
                      voice_downlink,voice_recognition, voice_uplink
            输出方式:amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp
    */
    //设置音频源
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    //设置视频源:Surface和Camera 两种
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    //设置视频输出格式
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    //设置视频编码格式
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    //设置音频编码格式
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    //设置视频编码的码率
    mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
    //设置视频编码的帧率
    mMediaRecorder.setVideoFrameRate(30);
    //设置视频尺寸大小
    mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
    //设置视频输出路径
    mMediaRecorder.setOutputFile(path);

其他的代码与屏幕录制相同,这里不再附加;可以从这里进行下载写好的Demo,可以直接运行;
Android 5.0 屏幕录制

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值