您的位置:首页 > 移动开发 > Android开发

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 屏幕录制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 对象