滨州做网站的科技公司/广州网站推广联盟

滨州做网站的科技公司,广州网站推广联盟,wordpress 标题空格,网站建设策划书录制屏幕 1、界面 2、核心代码 import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.app.Service import android.content.Context import android.content.Intent import android.graphics.Bi…

录制屏幕

1、界面

2、核心代码

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.hardware.display.DisplayManager
import android.hardware.display.VirtualDisplay
import android.media.MediaRecorder
import android.media.projection.MediaProjection
import android.media.projection.MediaProjectionManager
import android.os.Build
import android.os.IBinder
import android.util.DisplayMetrics
import android.util.Log
import android.view.WindowManager
import androidx.core.app.NotificationCompat
import java.io.IOExceptionclass ScreenRecordService : Service() {private var mContext: Context? = nullprivate var projectionManager: MediaProjectionManager? = nullprivate var mMediaProjection: MediaProjection? = nulloverride fun onBind(intent: Intent): IBinder {TODO("Return the communication channel to the service.")}override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {mContext = thisvar resultCode = intent?.getIntExtra("resultCode", -1)var path = intent?.getStringExtra("path")var resultData: Intent? = intent?.getParcelableExtra("data")Log.e("TAG", "录制的路径为:" + path)startNotification();projectionManager = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManagermMediaProjection = resultCode?.let { resultData?.let { it1 -> projectionManager?.getMediaProjection(it, it1) } }path?.let { startRecording(it) }return super.onStartCommand(intent, flags, startId)}private var NOTIFICATION_CHANNEL_ID = "id";private var NOTIFICATION_CHANNEL_NAME = "channel";private var NOTIFICATION_CHANNEL_DESC = "desc";private fun startNotification() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {var notificationIntent = Intent(mContext, ScreenRecordService::class.java)var pendingIntent: PendingIntent? = nullpendingIntent = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);} else {PendingIntent.getActivity(this, 0, notificationIntent,PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE);}var notificationBuilder = mContext?.let {NotificationCompat.Builder(it, NOTIFICATION_CHANNEL_ID).setLargeIcon(BitmapFactory.decodeResource(mContext!!.resources, R.drawable.ic_launcher_foreground)).setSmallIcon(R.drawable.ic_launcher_foreground).setContentTitle("start record").setContentText("=== start record ===").setContentIntent(pendingIntent)};var notification = notificationBuilder?.build();var channel = NotificationChannel(NOTIFICATION_CHANNEL_ID,NOTIFICATION_CHANNEL_NAME,NotificationManager.IMPORTANCE_DEFAULT);channel.description = NOTIFICATION_CHANNEL_DESC;var notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotificationManager.createNotificationChannel(channel)startForeground(1, notification);}}private var isScreenRecoding = falseprivate var mMediaRecorder: MediaRecorder? = nullprivate var mVirtualDisplay: VirtualDisplay? = nullprivate fun startRecording(filePath: String) {if (!isScreenRecoding) {try {// 创建 MediaRecorder 并设置参数val metrics = DisplayMetrics()val windowManager: WindowManager = mContext?.getSystemService(WINDOW_SERVICE) as WindowManagerwindowManager.defaultDisplay.getMetrics(metrics)mMediaRecorder = MediaRecorder()mMediaRecorder?.setVideoSource(MediaRecorder.VideoSource.SURFACE)mMediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)mMediaRecorder?.setOutputFile(filePath)mMediaRecorder?.setVideoSize(metrics.widthPixels, metrics.heightPixels)mMediaRecorder?.setVideoEncoder(MediaRecorder.VideoEncoder.H264)mMediaRecorder?.setVideoEncodingBitRate(1920 * 1080 * 3)mMediaRecorder?.setVideoFrameRate(30)// 准备 MediaRecordermMediaRecorder?.prepare()// 创建 VirtualDisplay 以获取屏幕内容mVirtualDisplay = mMediaProjection?.createVirtualDisplay("ScreenRecord",metrics.widthPixels, metrics.heightPixels, metrics.densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mMediaRecorder?.surface, null, null)// 开始录制mMediaRecorder?.start()isScreenRecoding = trueLog.i("TAG", "开始录屏 $filePath")} catch (e: IOException) {Log.e("TAG", "录屏失败: " + e.message)e.printStackTrace()}}}public fun stopRecording() {if (isScreenRecoding) {try {// 停止录制mMediaRecorder?.stop()mMediaRecorder?.reset()mMediaRecorder?.release()mMediaRecorder = null// 停止 VirtualDisplaymVirtualDisplay?.release()// 停止 MediaProjectionmMediaProjection?.stop()Log.i("TAG", "结束录屏")} catch (e: Exception) {Log.e("TAG", "停止录屏失败: " + e.message)e.printStackTrace()}isScreenRecoding = false}}override fun onDestroy() {stopRecording()super.onDestroy()}
}
/*** 注意:* 1、需要手动给文件读写权限* 2、保存的视频文件在/storage/emulated/0/screen.mp4*/
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_main)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}}override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == 500) {val path = Environment.getExternalStorageDirectory().absolutePath// 录屏权限screenService = Intent(this, ScreenRecordService::class.java)screenService?.let {it.putExtra("resultCode", resultCode)it.putExtra("data", data)it.putExtra("path", "$path/screen.mp4")startForegroundService(it)}}}/** 开始录制 **/fun startRecord(view: View) {start()}/** 停止录制 **/fun stopRecord(view: View) {stop()}private var mProjectionManager: MediaProjectionManager? = nullprivate var screenService: Intent? = nullprivate fun start() {mProjectionManager = getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager// 请求录屏权限mProjectionManager?.createScreenCaptureIntent()?.let { startActivityForResult(it, 500) };}private fun stop() {stopService(screenService)}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.ScreenRecord"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name=".ScreenRecordService"android:enabled="true"android:exported="true"android:foregroundServiceType="mediaProjection" /></application></manifest>

3、下载地址

https://download.csdn.net/download/wy313622821/90115690

4、操作注意

点击开始录制后,切换到需要录制的界面,如果想要结束则回到当前应用点击停止录屏按钮

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

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

相关文章

【Excel学习记录】01-认识Excel

1.之前的优秀软件Lotus-1-2-3 默认公式以等号开头 兼容Lotus-1-2-3的公式写法&#xff0c;不用写等号 &#xff1a; 文件→选项→高级→勾选&#xff1a;“转换Lotus-1-2-3公式(U)” 备注&#xff1a;对于大范围手动输入公式可以使用该选项&#xff0c;否则请不要勾选&#x…

短视频矩阵抖音SEO源码OEM独立部署

短视频优化矩阵源码涉及对抖音平台上的视频内容进行筛选与排序&#xff0c;目的是增强其在搜索引擎中的可见度&#xff0c;以便更多用户能够浏览到这些视频。而抖音SEO优化系统则是通过构建一个分析框架&#xff0c;来解析抖音上的用户数据、视频信息及标签等元素&#xff0c;并…

MySQL——buffer poll

为什么要有buffer poll&#xff1f; 如果没有buffer poll&#xff0c;每次读取数据的时候都是从磁盘上读的&#xff0c;这样效率是很差的的。 所以有了提高效率的方式&#xff0c;就加上了一个缓存——buffer poll 所以&#xff0c;当我们读取数据的时候就有以下的方式 当读…

生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例

目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中&#xff0c;性能优…

元宇宙时代的社交平台:Facebook的愿景与实践

随着科技的不断进步&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念逐渐走进了人们的视野。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在这场元宇宙革命中扮演着重要角色。Meta不仅在不断扩展其社交平台的边界&#xff0c;还…

C# 小案例(IT资产管理系统)

开发工具&#xff1a;visual studio 2022 语言&#xff1a;C# 数据库&#xff1a;Sql Server 2008 页面展示 一、登录 二、主窗体 三、用户管理 四、资产管理 五、关于 Java版地址&#xff1a;基于若依开发物品管理系统(springbootvue)_若依物品管理系统-CSDN博客 Python版…

分布式日志系统设计

一、分布式日志系统定义 分布式日志系统是一种用于收集、存储和分析大规模分布式系统日志的系统。它可以帮助开发人员和系统管理员实时监控和调试系统&#xff0c;提高系统可靠性和可用性&#xff0c;同时也可以用于日志分析和故障排查。 二、简单设计思路 日志收集&#xff…

敏捷开发04:Scrum 中的 Product Backlog(产品待办列表) 详细介绍

Product Backlog 产品待办列表 在计划开发产品功能时&#xff0c;都希望产品功能上线后&#xff0c;用户能够喜欢并经常使用。 因此在开发产品新功能时&#xff0c;就要衡量哪些产品需求是对用户最有价值&#xff0c;这是最应该思考的问题。 然后把这些有价值的需求集合放在一…

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

声明 因为这份文档我是边做边写的&#xff0c;遇到问题重新装了好几次所以IP会很乱 ESXI主机为192.168.20.10 VCSA为192.168.20.7&#xff0c;后台为192.168.20.7:5480 后期请自行对应&#xff0c;后面的192.168.20.57请对应192.168.20.7&#xff0c;或根据自己的来 第一阶段…

110.【C语言】编写命令行程序(1)

目录 1.前置知识 "命令"的含义 运行C语言程序 2.介绍 main函数的参数 实验1 执行结果 实验2 执行结果 修改代码 实验3 分析 方法:遍历数组argv[]中的所有参数 执行结果 修改代码 执行结果 1.前置知识 "命令"的含义 WINR输入cmd,在cmd窗口下…

Leecode刷题C语言之半有序排列

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int semiOrderedPermutation(int* nums, int numsSize) {int first 0, last 0;for (int i 0; i < numsSize; i) {if (nums[i] 1) {first i;}if (nums[i] numsSize) {last i;}}return firs…

RPC设计--从reactor设计 (IOthread)

主从reactor架构 一般的一个网络IO库都是主从reactor模式&#xff0c;即主线程中有一个MainReactor&#xff0c;其负责监听ListenFd&#xff0c;当接受到新的用户连接时&#xff0c;返回的clientfd并不会加入的MainReacotr&#xff0c;而是在子线程&#xff08;这里称为IO线程&…

Scala中求斐波那契数列的第n项

求斐波那契数列的第n项 问题&#xff1a;求 斐波那契数列的第n项 记&#xff1a; 0 1 1 2 3 5 8 13 21 34 55 ... 从第3项开始 f(n) f(n-1) f(n-2) 1.基本情况&#xff08;直接能求的&#xff09;&#xff1a;f(0) 0,f(1) 1 2.递归情况&#xff08;大事化小&#xff0c;自己…

【Golang】Go语言编程思想(六):Channel,第六节,并发编程模式

并发模式 下例重新对 channel 的用法进行回顾&#xff1a; package mainimport ("fmt""math/rand""time" )func msgGen(name string) chan string {c : make(chan string)go func(name string) { // 在这个 goroutine 当中向外发送数据i : 0fo…

重生之我在异世界学编程之C语言:深入结构体篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文《1》 结构体的两种声明一、结构…

Scala递归中求汉罗塔游戏的步骤

记&#xff1a;f(n,"A","B","C")表示n个盘子从A柱子上移动到C柱子上&#xff0c;借用B柱子的过程 f(要移动的盘子的个数&#xff0c;起点&#xff0c;辅助柱子&#xff0c;终点) 1.基本情况(直接能求的)&#xff1a;f(1,"A","B&…

输入url到显示主页的详细过程

从浏览器地址输入url到显示主页的过程&#xff1f; 主要分为&#xff1a;DNS解析&#xff0c;TCP连接&#xff0c;发送HTTP请求&#xff0c;服务器处理请求&#xff0c;浏览器接收HTTP响应&#xff0c;断开连接 DNS解析&#xff1a; 浏览器发起一个DNS请求到DNS服务器&#…

使用C#通过ColorMatrix对象为图像重新着色

此示例产生了一些令人印象深刻的结果&#xff0c;但实际上非常简单。 它使用其他几个示例演示的 ImageAttribute 技术来快速操作图像的颜色。 下面的AdjustColor方法启动图像着色的过程。 // Adjust the images colors. private Image AdjustColor(Image image) {// Make the …

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代&#xff0c;手机租赁系统已经成为一种新兴的商业模式&#xff0c;非常符合当下市场需求。那么&#xff0c;在开发这样一个系统的时候&#xff0c;首先要从需求分析和市场调研开始。在这一阶段&#xff0c;你需要了解用户需要什么&#xff0…

unity打包web,如何减小文件体积,特别是 Build.wasm.gz

unity打包WebGL&#xff0c;使用的是wasw&#xff0c;最终生成的Build.wasm.gz体积很大&#xff0c;有6.5M&#xff0c;有几个方法可以稍微减小这个文件的大小 1. 裁剪引擎代码&#xff1a; 此步可将大小从6.5减小到 6.2&#xff08;此项默认开启&#xff0c;只是改了裁剪等级…