截屏和录屏
方案:在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);
@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();
停止录制,释放资源