Android10以上MediaProjection截屏

起因

在系统升级到Android10以上之后,之前的截屏方式不能用了,而且必须将MediaProjection放在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);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方法

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

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

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

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

相关文章

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算&#xff08;判断&#xff09; 1~100中哪些是素数、哪些是合数。 素数也称为质数&#xff0c;是只能被1及其自身整除的自然数。与素数相对应的是合数&#xff0c;合数可以被分解为若干个素数的乘积&#xff0c;这些素数称为这个合数的质…

分布式爬虫之Scrapy

[官方文档]&#xff08;https://docs.scrapy.org/en/latest/topics/item-pipeline.html&#xff09; Scrapy 的可以做的事情 Scrapy 是一个功能强大的开源网络爬虫框架&#xff0c;它可以用于从网页或其他源中提取数据。以下是 Scrapy 可以执行的一些常见任务&#xff1a; 网…

五个关于CSS3的常见面试题

CSS3面试题 1. CSS3中的渐变&#xff08;Gradient&#xff09;是什么&#xff1f;请举例说明其用法。 答案&#xff1a;CSS3中的渐变是一种可以在元素背景、边框或文本中创建平滑过渡效果的技术。主要有线性渐变&#xff08;linear-gradient&#xff09;和径向渐变&#xff0…

阿里云服务器多队列性能参数

阿里云服务器“多队列”是什么意思&#xff1f;多队列是指主网卡支持的最大网卡队列数。除弹性裸金属服务器实例规格外&#xff0c;辅助网卡支持的最大网卡队列数与主网卡一致。 阿里云服务器ECS规格和CPU内存配置不同&#xff0c;网卡支持的多队列性能参数值也不同&#xff0…

数据结构从入门到实战——顺序表的应用

目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁 2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息 2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中 2.9…

SpringBoot整合通用Mapper

pom引入依赖&#xff1a; <dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version></dependency><dependency><groupId>tk.mybatis</groupI…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch&#xff08;先看四&#xff01;先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

【图解计算机网络】网络协议分层解析

网络协议分层解析 网络协议分层应用层传输层网络层数据链路层 TCP/IP分层模型通讯示例 网络协议分层 网络协议分层一共有OSI七层网络协议&#xff0c;TCP/IP四层网络网络协议&#xff0c;还有五层网络协议。 七层由于分层太多过于复杂&#xff0c;实际应用中并没有使用&#x…

代码编辑工具PilotEditPro18.4版本在Windows系统的下载与安装配置

目录 前言一、PilotEdit Pro安装二、使用配置总结 前言 “ PilotEdit Pro是一个功能强大且功能丰富的文本和代码编辑器&#xff0c;可满足程序员、开发人员和IT专业人员的不同需求。定位为一个多功能的编辑解决方案&#xff0c;PilotEdit Pro以其对广泛的文本和代码文件格式的…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…

Node.js安装和配置

第一步&#xff1a;安装Node.js 首先&#xff0c;我们需要安装Node.js。请按照以下步骤进行操作&#xff1a; 步骤一&#xff1a;访问Node.js官方网站 打开你喜欢的浏览器&#xff0c;访问Node.js官方网站&#xff1a;https://nodejs.org 步骤二&#xff1a;下载Node.js安装…

相机摄影入门技巧,数码摄影技巧大全

一、资料前言 本套数码相机摄影资料&#xff0c;大小1.08G&#xff0c;共有42个文件。 二、资料目录 《aking人像摄影技巧分享》.pdf 《Nikon.D90数码单反摄影技巧大全》FUN视觉.全彩版.pdf 《不可不学的摄影技巧》.pdf 《常用场景摄影》.pdf 《单反数码摄影专家技法》.…

【Web】AFCTF 2021 题解(部分)

目录 BABY_CSP search secret google authenticator 随便做做&#xff0c;环境是NSS上的 BABY_CSP CSP绕过_script-src self-CSDN博客 CSP指令值 *&#xff1a; 星号表示允许任何URL资源&#xff0c;没有限制&#xff1b; self&#xff1a; 表示仅允许来自同源&#xff…

盲人购物指南:智能化辅助引领超市购物新体验

作为一名资深记者&#xff0c;我有幸见证了一位盲人朋友借助一款名为蝙蝠避障的高科技辅助应用&#xff0c;独立完成超市购物之旅&#xff0c;这一过程充分展示了盲人购物指南新时代的到来。 在前往超市的路上&#xff0c;这款应用犹如一位贴心的“电子向导”&#xff0c;实时为…

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

【剪映专业版】14为视频添加炫酷特效

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 1.特效 画面特效&#xff1a;用于整个画面 人物特效&#xff1a;仅用于画面中的人物&#xff0c;如画面中无人&#xff0c;则不起作用 2.添加特效 按号添加 可通过鼠标推动实现特效时间调节 可叠加使用特效 3.特效修…

危险场景智能运维巡检系统

在石油、天然气、煤炭和化工等行业&#xff0c;特别是在I/IIC级防爆区场景中&#xff0c;存在着诸如易燃、易爆、高温、有毒有害以及粉尘等危险因素。例如&#xff0c;油气转运站、催化裂化装置、煤化工甲醇车间以及制氢站等地点&#xff0c;都面临着这些潜在的危险。传统的人工…

34. 【Android教程】菜单:Menu

作为 Android 用户&#xff0c;你一定见过类似这样的页面&#xff1a; 它就是我们今天的主角——菜单&#xff0c;它的使用场景和作用不用多说&#xff0c;几乎每个 App 都会用到它&#xff0c;今天我们就一起来看看 Android 提供的几种菜单类型及用法。 1. 菜单的几种类型 根…

【小贪】大数据处理:Pyspark, Pandas对比及常用语法

近期致力于总结科研或者工作中用到的主要技术栈&#xff0c;从技术原理到常用语法&#xff0c;这次查缺补漏当作我的小百科。主要技术包括&#xff1a; ✅数据库常用&#xff1a;MySQL, Hive SQL, Spark SQL✅大数据处理常用&#xff1a;Pyspark, Pandas⚪ 图像处理常用&#…

如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

一、开通阿里云OSS对象存储服务 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供 99.995 % 的服务可用性和多种存储类型&#xff0c;适用于数据湖存储&#xff0c;数据迁移&#xff0c;企…