Android10以上MediaProject截屏

起因

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

代码实现

新建一个ScreenRecorder.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中调用

 public void onCreate(Bundle bundle) {super.onCreate(bundle);}
/**
* 申请权限
*/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方法

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO多路转接之poll

目录 1. poll 的基本认识 2. poll 基于 select 的突破 3. poll() 系统调用 3.1. struct pollfd 结构 4. poll() 的 demo 5. poll 的总结 1. poll 的基本认识 poll 是一种多路转接的方案&#xff0c; 它的核心功能和 select 一模一样&#xff0c;我们知道 IO 等待事件就绪…

WebLogic 数据源连接泄露

编码时,有时会忘记释放使用的数据源连接,造成连接泄露,没有连接资源可用。 现象 java.sql.SQLException: Cannot obtain XAConnectionat weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1691)at weblogic.jdbc.jta.DataSource.getConnectionIntern…

论文略读:Window Attention is Bugged: How not to Interpolate Position Embeddings

iclr 2024 reviewer 打分 6666 窗口注意力、位置嵌入以及高分辨率微调是现代Transformer X CV 时代的核心概念。论文发现&#xff0c;将这些几乎无处不在的组件简单地结合在一起&#xff0c;可能会对性能产生不利影响问题很简单&#xff1a;在使用窗口注意力时对位置嵌入进行插…

华为再次布局新行业:合作伙伴已超前谋划,该领域将大有可为

华为布局新行业 华为向外界公布了一个重要信息&#xff1a;在过去的三年里&#xff0c;尽管受到美国的制裁&#xff0c;华为仍然成功地完成了超过13000个元器件的国产替代研发&#xff0c;以及4000多块电路板的迭代开发。 不仅在硬件领域取得了显著成就&#xff0c;在软件和生…

oracle 19c数据库W00n进程使用很多PGA内存资源的分析

今天&#xff0c;客户反馈测试环境的数据库PGA资源不足&#xff0c;报错ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT&#xff1b;分析是多个W00n进程使用大量PGA-触发了BUG&#xff0c;对应解决办法就是打补丁。&#xff08;民间办法就是KILL进程、重启数据库&…

大数据面试高频问题:大数据相关基础组件的维护及调优案例大全

目录 1、 Hadoop HDFS 磁盘空间不足问题 2、 Apache Spark Executor 内存溢出问题

基于云开发和微信小程序的爱宠家系统

基于云开发和微信小程序的爱宠家系统 “Development of PetCare Home System based on Cloud Computing and WeChat Mini Program” 完整下载链接:基于云开发和微信小程序的爱宠家系统 文章目录 基于云开发和微信小程序的爱宠家系统摘要第一章 系统概述1.1 研究背景1.2 研究目…

3d视图模型乱了怎么调?---模大狮模型网

在进行3D建模时&#xff0c;有时候您可能会遇到视图模型混乱的情况。这可能是由于模型结构问题、导入导出错误或编辑操作不当等原因造成的。混乱的模型不仅影响工作效率&#xff0c;还可能导致渲染结果不理想。本文将介绍六种有效的方法来调整混乱的3D视图模型&#xff0c;帮助…

css样式问题 --持续更新

css 去除 el-input 和 el-textarea 边框样式 <style> .el-input__wrapper,.el-textarea__inner {border: none !important;box-shadow: none !important;padding: 0px;} </style>

【数据可视化包Matplotlib】Matplotlib基本绘图方法

目录 一、Matplotlib绘图的基本流程&#xff08;一&#xff09;最简单的绘图&#xff08;仅指定y的值&#xff09;&#xff08;二&#xff09;更一般的绘图&#xff08;同时指定x和y的值&#xff09;&#xff08;三&#xff09;增加更多的绘图元素 二、布局相关的对象——Figur…

Linux系统问题汇总

1. MAC版本VMawre打开一个已有的镜像文件&#xff1a;File——Open——CentOS 7-MySQL.vmx&#xff1b; 2. ifconfig 或者 ifconfig -a查看虚拟机接口及其网络&#xff1b; 问题&#xff1a; 2.1 ens33端口不存在&#xff1a;用ifconfig -a查看即可&#xff1b; 2.2 ens33端…

Python 物联网入门指南(四)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;构建光学字符识别的神经网络模块 本章介绍以下主题&#xff1a; 使用光学字符识别&#xff08;OCR&#xff09;系统 使…

多种方式打开SOLIDWORKS文件

在 SOLIDWORKS 中有多种打开文件的方法。一些最常用的方法包括双击文件资源管理器中的文件或拖放到 SOLIDWORKS 窗口中。当然&#xff0c;还有一种传统的方法&#xff0c;就是在SOLIDWORKS软件上方单击打开。 使用SOLIDWORKS“打开“命令 SOLIDWORKS 中的“打开“命令与任何其…

基于springboot实现在线考试系统设计【项目源码+论文说明】

基于springboot实现在线考试管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不…

Python不可变序列类型--字符串

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合集 私信未回可以加V:hacker0327 备注零基础学Python 订阅专…

ObjectMapper的具体介绍与使用

文章目录 声明一、前言二、ObjectMapper与JSONObject比较1、核心主要有三个部分&#xff1a;依赖包不同 2、ObjectMapper使用概述2.1、工程的pom.xml导包信息2.2、创建案例中的测试对象2.3、对象和JSON相互转化2.3.1、测试代码2.3.2、测试结果展示 2.4、集合和JSON像话转化2.4.…

设计和实现24位位图图片色彩翻转成互补色程序。

实验题目&#xff1a;设计和实现24位位图图片色彩翻转成互补色程序。 &#xff08;提示&#xff1a;24位位图文件中的数据部分定义了每上像素像素单元&#xff0c;每个像素由三个字节组成&#xff0c;分别表示红、绿、蓝&#xff08;r,g,b&#xff09;三个分量&#xff0c;假设…

Matlab|电价型负荷需求响应(考虑电价变化)

程序复现来源于《计及需求响应消纳风电的电-热综合能源系统经济调度 》第四章内容。 一、原理 需求响应的基本原理是需求侧根据电力市场价格和电网要求改变其负荷需求以 获取一定的利益回报。其中 PDR 可通过直观的电价变化信号引导用户调节用电方式&#xff0c; 从而达到优…

2024.4.13力扣每日一题——找到冠军 II

2024.4.13 题目来源我的题解方法一 拓扑排序思想 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2924 我的题解 方法一 拓扑排序思想 计算每个节点的入度&#xff0c;只有入度为0的节点才可能是冠军&#xff0c;但是若存在多个入度为0的节点&#xff0c;则无法知道谁是…

Qt for Android 开发环境

在搭建环境时开始感觉还挺顺利的&#xff0c;从 Qt 配置的环境里面看并没有什么问题&#xff0c;可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本&#xff0c;然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle&#xff0c;但是不管这么…