以前在工作中碰到一个问题,领导总是要求我给他路一段实现的功能效果或者当问题出现时,客户没办法描述清楚但是又找不到好用的免费录屏软件,所以昨天刚好有时间整理了一下,写了一个简易的Android录屏软件出来,这篇文章本事工作日志记录,也属于抛砖引玉系列,还是有很大的参考价值的。

主要实现方式就是MediaProjectionManager+MediaReocrder+Service组件的方式来实现录屏。需要在5.0以上机型才有效果。

按照惯例上图:

然后上代码:

package com.example.testmediaprojection;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {private Intent intent;private MediaProjectionManager mediaService;private Intent service;private boolean isRecording = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mediaService = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 10002);findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Button btn= (Button) view;if (isRecording) {btn.setText("STOPRECORD");Intent screenCaptureIntent = mediaService.createScreenCaptureIntent();MainActivity.this.startActivityForResult(screenCaptureIntent, 10001);} else {btn.setText("STARTRECORD");Intent service = new Intent(MainActivity.this, RecordService.class);MainActivity.this.stopService(service);isRecording = true;}}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 10001) {if (resultCode == RESULT_OK) {// 获得权限,启动Service开始录制service = new Intent(this, RecordService.class);service.putExtra("code", resultCode);service.putExtra("data", data);startService(service);isRecording = false;simulateHome(); // this.finish();  // 可以直接关闭Activity} else {Toast.makeText(this, "取消", Toast.LENGTH_LONG).show();}}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);}private void simulateHome() {Intent intent = new Intent(Intent.ACTION_MAIN);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addCategory(Intent.CATEGORY_HOME);this.startActivity(intent);}@Overrideprotected void onDestroy() {super.onDestroy();if (null != intent) {stopService(intent);}}
}
package com.example.testmediaprojection;import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.hardware.display.DisplayManager;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Environment;
import android.os.IBinder;
import android.os.Parcelable;import androidx.annotation.Nullable;import java.io.File;
import java.io.IOException;/*** 文件描述 :* 作    者: 徐干稳* 创建日期: 2020/8/25 10:15* 版   本: version 1.0*/
public class RecordService extends Service {private MediaProjectionManager mediaService;private MediaProjection mediaProjection;private Intent data;private int code;private int width;private int height;private int density;private MediaRecorder mediaRecorder;@Overridepublic void onCreate() {super.onCreate();mediaService = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);width = Resources.getSystem().getDisplayMetrics().widthPixels;height = Resources.getSystem().getDisplayMetrics().heightPixels;density = Resources.getSystem().getDisplayMetrics().densityDpi;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {code = intent.getIntExtra("code", -1);data = intent.getParcelableExtra("data");mediaProjection = mediaService.getMediaProjection(code, data);mediaRecorder = getMediaRecorder();mediaProjection.createVirtualDisplay("recordService", width, height, density, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.getSurface(), null, null);mediaRecorder.start();return Service.START_STICKY;}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private MediaRecorder getMediaRecorder() {MediaRecorder mediaRecorder = new MediaRecorder();mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);    //音频载体mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);    //视频载体mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);   //输出格式mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);  //音频格式mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //视频格式mediaRecorder.setVideoSize(width, height);  //sizemediaRecorder.setVideoFrameRate(30);    //帧率mediaRecorder.setVideoEncodingBitRate(3 * 1024 * 1024); //比特率mediaRecorder.setOrientationHint(0);    //旋转角度//创建文件夹File dir = new File(Environment.getExternalStorageDirectory()+File.separator+"record/");if (!dir.exists()) {dir.mkdirs();}//创建文件名String fileName = System.currentTimeMillis() / 1000 + ".mp4";//设置文件位置String filePath = dir + "/" + fileName;mediaRecorder.setOutputFile(filePath);try {mediaRecorder.prepare();} catch (IllegalStateException | IOException e) {e.printStackTrace();}return mediaRecorder;}@Overridepublic void onDestroy() {super.onDestroy();if(null!=mediaRecorder){mediaRecorder.stop();mediaRecorder.release();mediaRecorder=null;}}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="startRecord"android:id="@+id/btn"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.testmediaprojection"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECORD_AUDIO"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".RecordService" /></application></manifest>

以上代码就是实现这个功能的简易实现代码。看代码后应该都能看懂,这里就不再多讲,记录下来,日后必有用!

抛砖引玉系列:Android简易实现录屏软件。相关推荐

  1. android录屏软件

    android录屏软件 系统类型:Android手机(平板) 软件大小:1KB 软件简介:通过USB链接android.用鼠标键盘控制你的android 安装步骤: 1.安装的Android SDK( ...

  2. mac android 录屏软件下载,苹果录屏app下载 苹果录屏 for Android V2.1.3 安卓手机版 下载-脚本之家...

    苹果录屏是一款不错的手机录屏软件,该软件能帮助你录制流畅清晰视频,实现屏幕内容实时同步录制,录制视频流畅清晰不卡顿,需要的朋友可以下载使用. 应用介绍 苹果录屏,是一款免费屏幕录制软件,能帮助你录制流 ...

  3. android 录屏工具,安卓手机上最好的录屏软件在这里

    今天的这款软件真的是推荐,谁说只有电脑可以录屏,现在手机屏幕也可以录屏啦!最好用的录屏大师软件小编是找了很久今天才和大家分享的,纯属自己个人喜欢哦!想知道是什么软件的宝宝可以和小编一起往下看啦! 录屏 ...

  4. Android限制录制屏幕无声音,哪一个安卓录屏软件可以录制系统的声音

    今天介绍的这款软件许多宝宝在之前就已经问过我很多次了,因为没有什么特别好用,所以一直就没有给大家推荐什么,直到今天才来给大家推荐,是因为小编使用了几天之后发现可以介绍给你们录屏大师,因为它操作起来挺简 ...

  5. android 录屏软件,如何制作教学视频?教学视频录制方法

    如何制作教学视频?教学视频录制方法 如今,很多人各种视频上传到在线视频平台(腾讯视频,优酷,土豆等),最近在视频平台上教学视频越来越多,各种方面的老师不仅在学校和学院上课,而且在网络传递知识,就是网络 ...

  6. 截屏悬浮软件_功能强大,却小巧的录屏软件,不在错过你的王者时刻

    看看录屏是一款操作简单.功能强大的录屏软件.他可以设置你录制视频的一个分辨率,帧率以及录制屏幕方向,非常方便,用户将手机摇一摇就可以控制开启和停止录屏,高效录制精彩瞬间,在录制游戏视频的时候也可以做到 ...

  7. 录屏软件哪个好用?10个免费好用的「录屏软件」推荐

    想知道如何录制自己的流媒体视频吗?有几个选项可以让您免费录制流媒体视频:桌面屏幕录像机.在线工具.浏览器扩展.iOS 应用程序和 Android 应用程序. 查看下表以获取有关不同直播流媒体录像机的更 ...

  8. lazarus视频控件linux,开源软件之Lazarus:国产操作系统下写个跨平台截屏录屏软件...

    之前的开源系列文章里,我们介绍了类Delphi的开源IDE软件Lazarus,简单地讲就是让你在免费IDE里用Pascal(几乎就是Delphi编程语言object Pascal了)语言编程写软件.而 ...

  9. 班迪录屏软件的安装使用教程,非常简单有手就行(手动滑稽)

    首先:下载这真的没有办法教了,不会的建议先双手抱头放下你的电脑,不要祸害它了,他也不容易 点击下边的链接下载即可 (1条消息) 实用软件系列----班迪录屏我认为市面上最好用的录屏软件之一免费分享-图 ...

最新文章

  1. harmonyos能装app吗,真机运行HarmonyOS应用APP
  2. Boost:标准地图比较的测试程序
  3. python语言的单行注释以井号开头_python-注释
  4. java5.0下载_java虚拟机
  5. 【办公自动化】Excel“一键”生成国土“三调”转换代码
  6. feiyanghaotian(飞扬浩天)的csdn博客
  7. TCP-丢包率【传输中所丢数据包数量占发送数据包的比率=(输入报文-输出报文)/输入报文】【TCP只保证传输层消息可靠,并不保证应用层的消息可靠。想保证应用层的消息可靠性,需应用层自己实现逻辑做保障】
  8. 开源项目(VC++,MFC)
  9. 「牛市」的危险和川普的口罩|极客一周
  10. contiki 学习资料
  11. mysql多数据源配置
  12. Ubuntu下输入金钱符号时只能输入“₵“无法输入“$“
  13. 树莓派 teamviewer 使用代理服务器上网
  14. percona-tool文档说明(5)- 复制类
  15. php通信软件培训,小蚂蚁学习APP接口开发(3)—— 统一调用入口方式封装通信接口...
  16. 利用python open-cv aimageio完成avi png mp4 gif间的转换
  17. kernel方法的直观理解与详述
  18. 红米3s运行linux,小米红米3S/3X免解锁刷机教程_红米3S/3X不用解锁线刷救砖包
  19. mysql 闪电存储_详解MySQL中EXPLAIN解释命令
  20. 计算机开机怎么设置网络连接,win7系统如何设置开机自动连接宽带 设置宽带自动联网的办法...

热门文章

  1. SPSS免费安装教程(详细版)
  2. python图片转文字
  3. 换位思考的反思与总结
  4. Addressable编辑器相关开发问题
  5. 【场景削减】拉丁超立方抽样方法场景削减(Matlab代码实现)
  6. #Sam有话说#人以群分,共性与个性的智慧
  7. Java学习从这里开始
  8. 唱吧android逆向加密算法笔记 此文章已做脱敏处理不会对原厂家app安全构成威胁,仅供学习
  9. linux环境下写的C,一元二次方程示例
  10. 1089: 手机短号 (多实例)