安卓开发投屏反控实现方式
在安卓开发中,可以通过MediaProjection API来实现屏幕投屏的功能,同时也可以通过Socket通信实现反控功能。下面将详细介绍实现步骤和注意事项。
1. 创建MediaProjectionManager对象
首先,我们需要创建一个MediaProjectionManager对象,用于管理屏幕投影。
MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
2. 获取屏幕投影的Intent并启动Activity获取投影权限
通过MediaProjectionManager.createScreenCaptureIntent()方法获取屏幕投影的Intent,并启动Activity获取投影权限。在Activity的onActivityResult()回调方法中,通过MediaProjectionManager.getMediaProjection()方法获取MediaProjection对象。
Intent intent = mediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(intent, REQUEST_MEDIA_PROJECTION);@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_MEDIA_PROJECTION && resultCode == Activity.RESULT_OK) {mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);// ...}
}
3. 创建虚拟显示器进行屏幕投影
在Activity中,我们可以通过MediaProjection.createVirtualDisplay()方法创建一个虚拟显示器来进行屏幕投影。
ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
VirtualDisplay virtualDisplay = mediaProjection.createVirtualDisplay("MyScreen", width, height, dpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,imageReader.getSurface(), null, handler);
4. 将虚拟显示器的输出流转换成Bitmap或者ByteBuffer对象
接下来,我们需要将虚拟显示器的输出流转换成Bitmap或者ByteBuffer对象,并使用Socket通信将数据发送给远程设备。
Image image = imageReader.acquireLatestImage();
if (image != null) {ByteBuffer buffer = image.getPlanes()[0].getBuffer();int pixelStride = image.getPlanes()[0].getPixelStride();int rowStride = image.getPlanes()[0].getRowStride();int rowPadding = rowStride - pixelStride * width;Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);bitmap.copyPixelsFromBuffer(buffer);// 将bitmap转为byte数组并发送到远程设备byte[] data = getBytesFromBitmap(bitmap);sendToRemoteDevice(data);image.close();
}
5. 接收发送数据的远程设备信息并渲染屏幕
在远程设备上,可以通过Socket通信接收发送的数据,并将数据解码成Bitmap对象。随后,将Bitmap对象渲染到屏幕上。同时,可以通过Socket通信将鼠标和键盘事件发送回到安卓设备,实现反控功能。
// 从Socket接收数据并解码成Bitmap
byte[] data = receiveFromAndroidDevice();
Bitmap bitmap = getBitmapFromData(data);// 在屏幕上渲染Bitmap
imageView.setImageBitmap
相关文章:
安卓开发投屏反控实现方式
在安卓开发中,可以通过MediaProjection API来实现屏幕投屏的功能,同时也可以通过Socket通信实现反控功能。下面将详细介绍实现步骤和注意事项。 1. 创建MediaProjectionManager对象 首先,我们需要创建一个MediaProjectionManager对象&#…...
外网SSH远程连接linux服务器「cpolar内网穿透」
✨个人主页:bit me👇 目 录 视频教程🌴1. Linux CentOS安装cpolar☘️2. 创建TCP隧道🎍3. 随机地址公网远程连接🎋4. 固定TCP地址🎄5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章:无…...
Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队
导读 Deferred Components,官方实现的Flutter代码动态下发的方案。本文主要介绍官方方案的实现细节,探索在国内环境下使用Deferred Components,并且实现了最小验证demo。读罢本文,你就可以实现Dart文件级别代码的动态下发。 一、…...
08 集合框架1
什么是数据结构? 存储数据,组织数据的方法,就是对数据做增删改查的操作 常见的数据结构有哪些?各自的优缺点是什么? 数组:擅长修改 查找操作,不擅长增加 删除操作 链表:有单项链表和双向链表,擅长增加和删除操作,不擅长修改和查找的操作 队列:擅长操作头和尾,先进先出,…...
内卷把同事逼成了“扫地僧”,把Git上所有面试题整理成足足24W字测试八股文
互联网大厂更多的是看重学历还是技术? 毫无疑问,是技术,技术水平相近的情况下,肯定学历高/好的会优先一点,这点大家肯定都理解。 说实话,学弟学妹们找工作难,作为面试官招人也难呀!…...
10-jQuery-遍历children、parent、for、each、for...of等
1、for 循环:可以用来遍历数组或类数组对象,但不能用来遍历普通对象。 <ul><li>John</li><li>Doe</li><li>Jane</li><li>Doe</li> </ul><script>var lis $(li);for (var i 0; i &…...
联想集团财报:收入持续下滑,联想集团财务前景已恶化
来源:猛兽财经 作者:猛兽财经 联想集团2023财年第三季度财务业绩回顾 联想集团(00992)于2023年2月16日盘后公布了该公司2023财年第三季度的财报。 财报显示,联想集团的收入已经从2022财年第三季度的201.27亿美元下降到…...
GPT4限制被破解!ChatGPT实现超长文本处理的新方法
目录 前言 使用chat-gpt过程中有哪些痛点 1.无法理解人类情感和主观性 2.上下文丢失 3.约定被打断 那如何去解决这个痛点 Transformer(RMT)怎么去实现的 1.Transformer 模型 2.RMT模型 3.计算推理速率 4.渐进学习能力 总结 写到最后 大家好…...
奋斗,然后成功:我的架构狮之梦
与代码结缘 2018年,当时听说了一个很厉害的人——吴瀚清老师,也就是大家所熟知的“道哥”。关于他的事情有很多传说,于是我也很快成为了他的小迷弟,把吴瀚清老师当成了自己的偶像。 也是那一年,我买了人生中第一本关…...
自定义属性,v-bind computed的使用
0.0 自定义组件的使用 【掌握】 先自定义自己的组件 引入组件 import 组件名 from 路径/文件名 注册组件 <script> export default {components:{ // 组件注册组件名:组件名,组件名1},data(){ // 数据return {}},methods:{ // 方法} } </script&…...
解决城市内涝的措施有哪些?需要用到哪些监测设备?
随着城市化的不断推进,城市内涝问题日益凸显。极端天气事件如暴雨、台风等对城市基础设施和居民生活造成了严重影响。那么,解决城市内涝的措施有哪些?需要用到哪些监测设备?针对上述问题,本文会为大家一一进行讲解。 解决城市内涝的措施有哪…...
Spark大数据处理讲课笔记----Spark任务调度
零、本节学习目标 理解DAG概念了解Stage划分了解RDD在Spark中的运行流程 一、有向无环图 (一)DAG概念 DAG(Directed Acyclic Graph)叫做有向无环图,Spark中的RDD通过一系列的转换算子操作和行动算子操作形成了一个…...
【22-23春】AI作业10-经典卷积网络
1.LeNet & MNIST LeNet是一种神经网络的模型,用于图像识别和分类。他包含 3 个卷积层,2 个池化层,1 个全连接层。其中所有卷积层的所有卷积核都为 5x5,步长 strid1,池化方法都为全局 pooling,激活函数…...
第13章_约束
第13章_约束 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的…...
GPC规范--安全域基础概念
概述: 分为三种主流类型: 1、发卡方安全域(Issuer Security Domain, ISD),卡片上首要的、强制性存在的安全域,是卡片管理者(通常是发卡方)在卡片内的代表; 2、补充安全域(Supplementary Security Domain&am…...
C++初阶--C++入门之基础学习
0.前言 C是一门非常好的编程语言,但可能在学习C的过程中会遇到很多困难。人们常说 “一个人走得很快,一群人会走的更远”, 所以就让我们一起攻坚克难,一起征服C吧!从本章开始,我们将开始C的基础学习&#x…...
服务器虚拟化部署
服务器虚拟化部署 1、背景2、目的3、环境4、部署4.1、部署VMware ESXi4.1.1、准备工作4.1.2、部署ESXi4.1.3、配置ESXi4.1.4 、部署虚拟机 1、背景 项目上利旧9台服务器,项目需要使用15台服务器,外购已经没有项目硬件采购预算,只能从目前的…...
实验篇(7.2) 01. 实验环境介绍 远程访问 ❀ Fortinet网络安全专家 NSE4
【简介】学习NSE4,如果只看文章而不动手做实验,就象耍流氓。为了有效的巩固学习到的内容,建议经常动手做实验。实验不怕出错,身经百战后,再在生产环境部署和配置FortiGate防火墙,就会做到胸有成竹。 虚拟实…...
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
ThinkPHP6 模型层的模型属性,表映射关系,以及模型层的CRUD及如何在控制层中使用模型层 1. model 模型层的默认映射规则 模型,即mvc模式中的model层,model层用来对接数据库,操作数据库的增删改查。 在tp6中ÿ…...
CodeForces.1806A .平面移动.[简单][判断可达范围][找步数规律]
题目描述: 题目解读: 给定移动规则以及起始点,终点;分析终点是否可达,可达则输出最小步数。 解题思路: 首先要判定是否可达。画图可知,对于题目给定的移动规则,只能到达起始点(a,b…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
