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开发如何实现录屏小功能相关推荐

  1. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

    Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...

  2. android 隐藏图标_苹果手机竟然还有这么多隐藏小功能(一)

        关注上方蓝字,获取更多精彩内容! 苹果手机清内存.一秒置顶.密码保险箱.图标隐身.....想不到的,没发现的,这里帮你全部整理好,赶快来嗨下吧!1.苹果手机 清内存 相对于以前内存比较小安卓手 ...

  3. 手机自带计算机的功能,手机上的这3个小功能,比电脑方便好用,你知道吗?...

    从智能手机面世以来,手机科技的发展速度越来越快,基本上每隔半年就进行更新换代. 积累到现在,一些智能手机上的黑科技功能,也是越来越多,甚至都快要跟电脑相媲美了. 当然,手机中的黑科技功能并非全部默认打 ...

  4. android 手机 拍 全景 java_Android开发如何调用相机的全景拍摄功能

    首先,32313133353236313431303231363533e58685e5aeb931333363396331来了解一下什么是场景模式. 最简单的方法当然是google了,这里有一篇文章讲 ...

  5. JS项目开发中常用的一些小功能

    目录 字符串技巧 1.比较时间 2.格式化money 3.生成随机ID 4.生成随机 HEX 颜色值 5.Generate star ratings​​​​​​​ 6.网址查询参数​​​​​​​ 7. ...

  6. Windows Mobile下GPS管理软件NavsGo之GPS侦测功能的开发

    简述 在上篇文章 Windows Mobile下GPS管理软件NavsGo之GPS监控功能的开发 概述了NavsGo项目以及讲述了GPS监控功能的开发,GPS.net控件的使用,这篇文章讲述侦测功能的 ...

  7. 功能安全 李艳文_如何理解功能安全管理

    功能安全标准ISO 26262在Part2部分讲述了功能安全管理的内容.但是大家在进行具体功能安全项目开发过程,往往将功能安全管理归结为流程,在实际开发过程不重视,甚至功能安全管理往往被忽视掉,而是直 ...

  8. 苹果iOS 15.5正式版实用小功能盘点 这11个功能你要知道

    苹果iOS 15.5正式更新了,而更新了许多新功能,其中就有11个小功能就特别实用,但知道的朋友不是很多,下面就为大家推荐iOS 15.5的11个实用的小功能. 苹果iOS 15.5正式版实用小功能盘 ...

  9. android 禁止截屏录屏功能,android 应用禁止截屏录屏

    更新记录 1.0.0(2021-02-01) Android 应用禁止截屏录屏 平台兼容性 Android iOS 适用版本区间:4.4 - 11.0 × 原生插件通用使用流程: 购买插件,选择该插件 ...

  10. Android开发中ListView多屏的全选、反选功能

    [size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...

最新文章

  1. Jquery Ajax时 error处理 之 parsererror
  2. python推荐系统-用python写个简单的推荐系统示例程序
  3. css实现右侧固定宽度,左侧宽度自适应
  4. Exchange 服务器查看版本号
  5. android build获取ext,android – 如何在Gradle中获取当前构建类型
  6. CSS选择器的权重与优先规则
  7. Python demjson 下载并安装
  8. WPF中的命令与命令绑定(二)
  9. MongoDB简单使用 —— 安装
  10. wps显示ntko签章服务器,ntko-系统内装有OFFICE和WPS,如何让IE加载NTKOOFFICE时以office打开文件而不是以WPS打...
  11. 配置文件解析利器-Config库
  12. 信息学奥赛一本通(C++版)
  13. 三星note10安装linux,三星Note10/Note10+新款Dex已支持Win10/macOS
  14. Manjaro Linux安装QQ和微信
  15. 慈溪视频软件测试,慈溪论坛
  16. 黑客攻防与网络安全-N-0
  17. 计算机专业英语短语,计算机常用专业英语缩写和短语
  18. CoffeeScript入门
  19. whistle 安装启动
  20. 使用kail破解wifi密码

热门文章

  1. 整理了25个Python文本处理案例,收藏!
  2. 基于OBD系统的量产车评估测试(PVE),你知多少?
  3. php调用微信公众号支付接口,Thinkphp实现微信公众号支付接口
  4. PHP 零基础入门笔记(1):PHP 基础
  5. Widows系统截屏工具
  6. 【机器人学习】六足机器人simulink仿真(运动学分析与步态仿真)
  7. uni-app开发桌面应用
  8. php 问号乱码,如何解决php问号乱码的问题
  9. 模仿实现百度搜索黑洞动画效果
  10. strut处理页面请求过程