Android5.0屏幕截屏与屏幕录制
2016-10-07 20:21
302 查看
一、屏幕截屏
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 屏幕录制
相关文章推荐
- DDMS工具截屏和录制屏幕
- Android安全性:屏蔽activity屏幕录制,截屏功能
- Android5.0以上实现对手机屏幕录制并将视频实时保存到本地(亦可实时传输)
- Android手机怎样录制屏幕及转GIF
- C# 屏幕监控 自动截屏程序 主窗体隐藏,仅在进程中显示
- 【好工具分享】如何进行屏幕录像记录操作步骤录制教程保存回放
- android 截屏 和屏幕录像
- linux 平台 ffmpeg 屏幕录制+声音录制
- 最简单的基于FFmpeg的AVDevice例子(屏幕录制)
- 【录教程必备】推荐几款屏幕录制工具(可录制GIF)
- 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
- 几款屏幕录制软件 ActivePresente
- Android 录制屏幕的实现方法
- 【工具推荐】LICEcap –GIF 屏幕录制工具
- 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
- 如何用AS录制手机屏幕并转成gif动态图
- Mac下的屏幕录制软件——ScreenFlow 3.0.6
- iOS xcode真机调试获取手机屏幕截屏
- 屏幕录制软件
- 使用屏幕录制专家--录制视频技巧