Android实现一键录屏功能(附源码)

一、项目介绍

在 android 5.0(api 21)及以上版本,系统提供了 mediaprojection api,允许应用在用户授权下录制屏幕内容并输出到视频文件。基于此,我们可以实现一个 一键录屏 功能,无需 root,也无需系统签名。完整功能包含:

申请录屏权限:使用 mediaprojectionmanager 触发系统授权对话框

屏幕采集与编码:结合 mediaprojection、virtualdisplay 与 mediarecorder(或 mediacodec + muxer)进行音视频同步录制

后台服务管理:将录屏流程封装在 service 或 foreground service 中,确保在应用切后台时仍可录制

用户交互:在应用内通过按钮控制录屏的启动、暂停、停止,并提供录制时长实时显示

文件存储与管理:自动将录制文件保存到外部存储或 mediastore,支持列表预览与播放

性能与兼容:兼容不同分辨率、适配屏幕方向变化,优化视频码率与帧率,控制录屏对系统性能的影响

二、相关技术与原理

技术功能
mediaprojection提供屏幕内容采集权限,输出到 virtualdisplay
virtualdisplay将屏幕内容镜像到指定 surface(例如 mediarecorder 的输入)
mediarecorder原生音视频录制 api,简化同步编码、封装 av 文件
mediacodec + muxer手动编码与封装,获得更细粒度控制(可选高级方案)
service后台管理录屏任务,结合前台服务确保录制不中断
mediastoreandroid 10+ 存储协议,安全写入公共相册
notification前台服务需在通知栏持续显示录制状态

api 要求:最早 api 21,建议应用最小支持 api 23 以上,以便简化外部存储和权限管理。

编解码参数:典型分辨率与帧率组合:1080×1920@30fps、720×1280@30fps;视频码率 4–8 mbps;音频码率 128 kbps;

三、系统权限与用户授权

manifest 权限




运行时授权

android 6.0+ 需请求存储与麦克风权限

通过 mediaprojectionmanager.createscreencaptureintent() 发起系统录屏授权对话框

四、项目架构与流程

用户点击“开始录制”按钮


mainactivity 发起录屏授权 intent


onactivityresult 收到授权 result_ok & data intent


启动 screenrecordservice(前台服务),传入 data


service 中:
├─ 初始化 mediarecorder
├─ 获取 mediaprojection
├─ 创建 virtualdisplay,surface 指向 mediarecorder
├─ 调用 mediarecorder.start()


循环录制屏幕与麦克风数据


用户点击“停止录制”


service 调用 mediarecorder.stop(), reset(), release()

└─ 通知主进程录制完成,保存文件到 mediastore

五、环境配置与依赖

// app/build.gradle
plugins {
  id 'com.android.application'
  id 'kotlin-android'
}
 
android {
  compilesdk 34
  defaultconfig {
    applicationid "com.example.screenrecorder"
    minsdk 23
    targetsdk 34
  }
  buildfeatures { viewbinding true }
}
 
dependencies {
  implementation "androidx.appcompat:appcompat:1.6.1"
  implementation "androidx.core:core-ktx:1.10.1"
  implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1"
}

六、完整代码整合

// =======================================================
// 文件:androidmanifest.xml
// 描述:权限申请与 service 声明
// =======================================================

 
  
  
  
 
  
    
      
        
        
      
    
    
  

 
// =======================================================
// 文件:app.kt
// 描述:application,用于初始化通知渠道
// =======================================================
package com.example.screenrecorder
 
import android.app.application
import android.app.notificationchannel
import android.app.notificationmanager
import android.os.build
 
class app : application() {
  companion object { const val channel_id = "screen_recorder_channel" }
  override fun oncreate() {
    super.oncreate()
    if (build.version.sdk_int >= build.version_codes.o) {
      notificationmanager::class.java
        .getsystemservice(notificationmanager::class.java)
        .createnotificationchannel(
          notificationchannel(
            channel_id,
            "screen recorder service",
            notificationmanager.importance_low
          )
        )
    }
  }
}
 
// =======================================================
// 文件:res/values/themes.xml
// 描述:应用主题
// =======================================================