android 录屏功能,Android开发如何实现录屏小功能
Android开发如何实现录屏小功能
发布时间:2020-07-30 09:20:54
来源:亿速云
阅读:222
作者:小猪
这篇文章主要讲解了Android开发如何实现录屏小功能,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
最近开发中,要实现录屏功能,查阅相关资料,发现调用 MediaProjectionManager的api 实现录屏功能即可:
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
public class RecordScreenActivity extends Activity {
private boolean isRecord = false;
private int mScreenWidth;
private int mScreenHeight;
private int mScreenDensity;
private int REQUEST_CODE_PERMISSION_STORAGE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermission();
getScreenBaseInfo();
startScreenRecord();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1000) {
if (resultCode == RESULT_OK) {
//获得录屏权限,启动Service进行录制
Intent intent = new Intent(this, ScreenRecordService.class);
intent.putExtra("resultCode", resultCode);
intent.putExtra("resultData", data);
intent.putExtra("mScreenWidth", mScreenWidth);
intent.putExtra("mScreenHeight", mScreenHeight);
intent.putExtra("mScreenDensity", mScreenDensity);
startService(intent);
finish();
}
}
}
//start screen record
private void startScreenRecord() {
//Manages the retrieval of certain types of MediaProjection tokens.
MediaProjectionManager mediaProjectionManager =
(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
//Returns an Intent that must passed to startActivityForResult() in order to start screen capture.
Intent permissionIntent = mediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(permissionIntent, 1000);
}
/**
* 获取屏幕基本信息
*/
private void getScreenBaseInfo() {
//A structure describing general information about a display, such as its size, density, and font scaling.
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels;
mScreenDensity = metrics.densityDpi;
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void requestPermission() {
if (Build.VERSION.SDK_INT >= 23) {
String[] permissions = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA
};
for (String str : permissions) {
if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
this.requestPermissions(permissions, REQUEST_CODE_PERMISSION_STORAGE);
return;
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==REQUEST_CODE_PERMISSION_STORAGE){
startScreenRecord();
}
}
}
service 里面进行相关录制工作
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by dzjin on 2018/1/9.
*/
public class ScreenRecordService extends Service {
private int resultCode;
private Intent resultData=null;
private MediaProjection mediaProjection=null;
private MediaRecorder mediaRecorder=null;
private VirtualDisplay virtualDisplay=null;
private int mScreenWidth;
private int mScreenHeight;
private int mScreenDensity;
private Context context=null;
@Override
public void onCreate() {
super.onCreate();
}
/**
* Called by the system every time a client explicitly starts the service by calling startService(Intent),
* providing the arguments it supplied and a unique integer token representing the start request.
* Do not call this method directly.
* @param intent
* @param flags
* @param startId
* @return
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try{
resultCode=intent.getIntExtra("resultCode",-1);
resultData=intent.getParcelableExtra("resultData");
mScreenWidth=intent.getIntExtra("mScreenWidth",0);
mScreenHeight=intent.getIntExtra("mScreenHeight",0);
mScreenDensity=intent.getIntExtra("mScreenDensity",0);
mediaProjection=createMediaProjection();
mediaRecorder=createMediaRecorder();
virtualDisplay=createVirtualDisplay();
mediaRecorder.start();
}catch (Exception e) {
e.printStackTrace();
}
/**
* START_NOT_STICKY:
* Constant to return from onStartCommand(Intent, int, int): if this service's process is
* killed while it is started (after returning from onStartCommand(Intent, int, int)),
* and there are no new start intents to deliver to it, then take the service out of the
* started state and don't recreate until a future explicit call to Context.startService(Intent).
* The service will not receive a onStartCommand(Intent, int, int) call with a null Intent
* because it will not be re-started if there are no pending Intents to deliver.
*/
return Service.START_NOT_STICKY;
}
//createMediaProjection
public MediaProjection createMediaProjection(){
/**
* Use with getSystemService(Class) to retrieve a MediaProjectionManager instance for
* managing media projection sessions.
*/
return ((MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE))
.getMediaProjection(resultCode,resultData);
/**
* Retrieve the MediaProjection obtained from a succesful screen capture request.
* Will be null if the result from the startActivityForResult() is anything other than RESULT_OK.
*/
}
private MediaRecorder createMediaRecorder(){
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
String filePathName= Environment.getExternalStorageDirectory()+"/"+simpleDateFormat.format(new Date())+".mp4";
//Used to record audio and video. The recording control is based on a simple state machine.
MediaRecorder mediaRecorder=new MediaRecorder();
//Set the video source to be used for recording.
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
//Set the format of the output produced during recording.
//3GPP media file format
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//Sets the video encoding bit rate for recording.
//param:the video encoding bit rate in bits per second.
mediaRecorder.setVideoEncodingBitRate(5*mScreenWidth*mScreenHeight);
//Sets the video encoder to be used for recording.
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//Sets the width and height of the video to be captured.
mediaRecorder.setVideoSize(mScreenWidth,mScreenHeight);
//Sets the frame rate of the video to be captured.
mediaRecorder.setVideoFrameRate(60);
try{
//Pass in the file object to be written.
mediaRecorder.setOutputFile(filePathName);
//Prepares the recorder to begin capturing and encoding data.
mediaRecorder.prepare();
}catch (Exception e){
e.printStackTrace();
}
return mediaRecorder;
}
private VirtualDisplay createVirtualDisplay(){
/**
* name String: The name of the virtual display, must be non-empty.This value must never be null.
width int: The width of the virtual display in pixels. Must be greater than 0.
height int: The height of the virtual display in pixels. Must be greater than 0.
dpi int: The density of the virtual display in dpi. Must be greater than 0.
flags int: A combination of virtual display flags. See DisplayManager for the full list of flags.
surface Surface: The surface to which the content of the virtual display should be rendered, or null if there is none initially.
callback VirtualDisplay.Callback: Callback to call when the virtual display's state changes, or null if none.
handler Handler: The Handler on which the callback should be invoked, or null if the callback should be invoked on the calling thread's main Looper.
*/
/**
* DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR
* Virtual display flag: Allows content to be mirrored on private displays when no content is being shown.
*/
return mediaProjection.createVirtualDisplay("mediaProjection",mScreenWidth,mScreenHeight,mScreenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mediaRecorder.getSurface(),null,null);
}
@Override
public void onDestroy() {
super.onDestroy();
if(virtualDisplay!=null){
virtualDisplay.release();
virtualDisplay=null;
}
if(mediaRecorder!=null){
mediaRecorder.stop();
mediaRecorder=null;
}
if(mediaProjection!=null){
mediaProjection.stop();
mediaProjection=null;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
录屏功能就这么实现了,有什么不妥之处,敬请留言讨论。
看完上述内容,是不是对Android开发如何实现录屏小功能有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。
android 录屏功能,Android开发如何实现录屏小功能相关推荐
- Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达
Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...
- android 隐藏图标_苹果手机竟然还有这么多隐藏小功能(一)
关注上方蓝字,获取更多精彩内容! 苹果手机清内存.一秒置顶.密码保险箱.图标隐身.....想不到的,没发现的,这里帮你全部整理好,赶快来嗨下吧!1.苹果手机 清内存 相对于以前内存比较小安卓手 ...
- 手机自带计算机的功能,手机上的这3个小功能,比电脑方便好用,你知道吗?...
从智能手机面世以来,手机科技的发展速度越来越快,基本上每隔半年就进行更新换代. 积累到现在,一些智能手机上的黑科技功能,也是越来越多,甚至都快要跟电脑相媲美了. 当然,手机中的黑科技功能并非全部默认打 ...
- android 手机 拍 全景 java_Android开发如何调用相机的全景拍摄功能
首先,32313133353236313431303231363533e58685e5aeb931333363396331来了解一下什么是场景模式. 最简单的方法当然是google了,这里有一篇文章讲 ...
- JS项目开发中常用的一些小功能
目录 字符串技巧 1.比较时间 2.格式化money 3.生成随机ID 4.生成随机 HEX 颜色值 5.Generate star ratings 6.网址查询参数 7. ...
- Windows Mobile下GPS管理软件NavsGo之GPS侦测功能的开发
简述 在上篇文章 Windows Mobile下GPS管理软件NavsGo之GPS监控功能的开发 概述了NavsGo项目以及讲述了GPS监控功能的开发,GPS.net控件的使用,这篇文章讲述侦测功能的 ...
- 功能安全 李艳文_如何理解功能安全管理
功能安全标准ISO 26262在Part2部分讲述了功能安全管理的内容.但是大家在进行具体功能安全项目开发过程,往往将功能安全管理归结为流程,在实际开发过程不重视,甚至功能安全管理往往被忽视掉,而是直 ...
- 苹果iOS 15.5正式版实用小功能盘点 这11个功能你要知道
苹果iOS 15.5正式更新了,而更新了许多新功能,其中就有11个小功能就特别实用,但知道的朋友不是很多,下面就为大家推荐iOS 15.5的11个实用的小功能. 苹果iOS 15.5正式版实用小功能盘 ...
- android 禁止截屏录屏功能,android 应用禁止截屏录屏
更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...
- Android开发中ListView多屏的全选、反选功能
[size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...
最新文章
- Jquery Ajax时 error处理 之 parsererror
- python推荐系统-用python写个简单的推荐系统示例程序
- css实现右侧固定宽度,左侧宽度自适应
- Exchange 服务器查看版本号
- android build获取ext,android – 如何在Gradle中获取当前构建类型
- CSS选择器的权重与优先规则
- Python demjson 下载并安装
- WPF中的命令与命令绑定(二)
- MongoDB简单使用 —— 安装
- wps显示ntko签章服务器,ntko-系统内装有OFFICE和WPS,如何让IE加载NTKOOFFICE时以office打开文件而不是以WPS打...
- 配置文件解析利器-Config库
- 信息学奥赛一本通(C++版)
- 三星note10安装linux,三星Note10/Note10+新款Dex已支持Win10/macOS
- Manjaro Linux安装QQ和微信
- 慈溪视频软件测试,慈溪论坛
- 黑客攻防与网络安全-N-0
- 计算机专业英语短语,计算机常用专业英语缩写和短语
- CoffeeScript入门
- whistle 安装启动
- 使用kail破解wifi密码