Android10以上MediaProjection截屏

embedded/2024/9/23 22:29:43/

起因

在系统升级到Android10以上之后,之前的截屏方式不能用了,而且必须将MediaProjection放在forground service里面跑才行。网上搜了一圈,都是语焉不详或者没有完整的一个代码应用。只能自己写一个,记录下

代码实现

java_3">新建一个ScreenRecorder.java

java">
public class ScreenRecorder extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private MediaProjection mMediaProjection;private MediaProjectionManager mMediaProjectionManager;private int SERVICE_ID = 123;private String NOTIFICATION_CHANNEL_ID = "Screen Capture channel";public static final String ACTION_START = "RecordService:Start";public static final String ACTION_SNAPSHOT = "RecordService:Snapshot";public static final String ACTION_STOP = "RecordService:Stop";public static final String EXTRA_RESULT_DATA = "RecordService:Extra:ResultData";@Overridepublic void onCreate() {super.onCreate();createNotificationChannel();startForeground(SERVICE_ID, new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID).build());mMediaProjectionManager = (MediaProjectionManager) getApplicationContext().getSystemService(Context.MEDIA_PROJECTION_SERVICE);}@Overridepublic int onStartCommand(final Intent intent, int flags, int startId) {if (intent != null) {if (intent.getAction() != null) {switch (intent.getAction()) {case ACTION_START:Log.d(TAG, "onStartCommand: start recorder");mMediaProjection = mMediaProjectionManager.getMediaProjection(Activity.RESULT_OK,Objects.requireNonNull(intent.getParcelableExtra(EXTRA_RESULT_DATA)));startCapture();return START_STICKY;case ACTION_SNAPSHOT:
//                        stopSelf();snapshot();break;case ACTION_STOP:Log.d(TAG, "onStartCommand: close imagereader");if (mImageReader != null){try{mImageReader.close();}catch (Exception exception){Log.e(TAG, "onStartCommand: "+ exception.getMessage() );}}stopSelf();return START_NOT_STICKY;}}}return super.onStartCommand(intent, flags, startId);}private void createNotificationChannel() {NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,"ScreenRecorder",NotificationManager.IMPORTANCE_DEFAULT);NotificationManager manager = getSystemService(NotificationManager.class);manager.createNotificationChannel(notificationChannel);}private ImageReader mImageReader;private void startCapture() {DisplayMetrics displayMetrics = new DisplayMetrics();WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);windowManager.getDefaultDisplay().getMetrics(displayMetrics);int screenWidth = displayMetrics.widthPixels;int screenHeight = displayMetrics.heightPixels;mImageReader = ImageReader.newInstance(screenWidth, screenHeight, PixelFormat.RGBA_8888, 2);mMediaProjection.createVirtualDisplay("mediaprojection", screenWidth, screenHeight,displayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);}private void snapshot(){if (mImageReader != null){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);//保存图片到本地CommonLib.saveMyBitmap("snapshot", bitmap);image.close();}}
}

AndroidManifest.xml中注册

<!--   申请权限 />-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<service android:name=".ScreenRecorder"android:exported="true"android:foregroundServiceType="mediaProjection"/>

Activity中调用

java"> public void onCreate(Bundle bundle) {super.onCreate(bundle);requestCapturePermission();}
/**
* 申请权限
*/public void requestCapturePermission() {MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);Intent intent = new Intent(mediaProjectionManager.createScreenCaptureIntent());startActivityForResult(intent, REQUESTRESULT);}
// 回调里面启动服务
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == RESULT_OK) {Intent intent = new Intent(this, ScreenRecorder.class);intent.setAction(ScreenRecorder.ACTION_START);intent.putExtra(ScreenRecorder.EXTRA_RESULT_DATA, data);startForegroundService(intent);EnableTakePhotos = true;}
}

snapshot方法

java">private void startSnapshot(){Intent intent = new Intent(this, ScreenRecorder.class);intent.setAction(ScreenRecorder.ACTION_SNAPSHOT);startService(intent);
}

可以设置一个按钮,然后在点击事件里面调用startSnapshot()方法即可


http://www.ppmy.cn/embedded/5914.html

相关文章

Redis:报错Creating Server TCP listening socket *:6379: bind: No error

错误&#xff1a; window下启动redis服务报错&#xff1a; Creating Server TCP listening socket *:6379: bind: No error 原因&#xff1a; 端口6379已被绑定&#xff0c;应该是因为上次未关闭服务 解决&#xff1a; ①依次输入命令&#xff1a; redis-cli.exe &#xff08…

论坛报名 | 中关村论坛“区块链与隐私计算论坛”报名开始!

2024中关村论坛—区块链与隐私计算论坛 正在报名&#xff01; 长安链开源社区作为区块链与隐私计算分论坛协同支持社区&#xff0c;为社区成员单位提供免费参会名额&#xff0c;名额有限先到先得&#xff0c;欢迎积极报名&#xff01; 论坛时间&#xff1a;2024年4月27日&…

FPGA - 基于自定义AXI FULL总线的PS和PL交互

前言 在FPGA - ZYNQ 基于Axi_Lite的PS和PL交互中&#xff0c;介绍了基于基于AXi_Lite的PL和PS交互&#xff0c;接下来构建基于基于Axi_Lite的PS和PL交互。 AXI_GP、AXI_HP和AXI_ACP接口 首先看一下ZYNQ SoC的系统框图&#xff0c;如下图所示。在图中&#xff0c;箭头方向代表…

比特币减半后适合挖矿吗

减半是指比特币挖矿奖励减半的过程&#xff0c;每当挖出210,000个区块后&#xff0c;比特币的挖矿奖励就会减半。减半后&#xff0c;每个区块的挖矿奖励减少一半&#xff0c;这对于矿工来说意味着他们挖到新的比特币的速度将会减慢。 减半对于挖矿是否适合取决于多个因素&…

React【Day4】

路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候&#xff0c;path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 …

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测&#xff08;单一传感器&#xff09; 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士&#xff0c;担任《Mechanical System and Signal Processing》等期刊审稿专家&#xff0c;擅长领域&#xff1…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第五套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第五套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;仅供参考&#xff09;&#xff08;共九套&#xff0c;每套四十个选择题&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadida…

计算机网络

概述 计算机网络是通信技术和计算机技术紧密结合的产物。 概念解释 通信系统模型 网络就是用来通信的&#xff0c;而计算机网络就是一种通信网络&#xff0c;其信源和信宿是计算机。 因此就可以说&#xff0c;计算机网络是通信技术和计算机技术紧密结合的产物。 定义 计算…