更新记录

1.0.0(2026-05-08)

1.0.0

屏幕共享、会议主控、屏幕推流、录音


平台兼容性

uni-app x(5.0)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
× × 7.0 1.0.0 × × ×

安卓屏幕推流(RTMP)

  1. 需要自定义基座
  2. 基于 UTS + 安卓原生(RootEncoder) 实现手机录音+屏幕录制推流。
  3. 服务端使用SRS(Simple Realtime Server)测试通过

一、核心概念

  • 推流流程:初始化 → 权限检查 → 开始推流 → 停止推流
  • 关键权限:麦克风权限(可选)、屏幕录制授权(必选)
  • 错误码:统一错误回调

二、错误码定义(必须熟记)

  AUDIO_PERMISSION_DENIED: 10001       // 麦克风权限被拒绝
  OPEN_PERMISSION_SETTING_FAILED: 10002 // 打开权限设置页失败
  PREPARE_STREAM_FAILED: 10003         // 推流准备失败
  SCREEN_CAPTURE_DENIED: 10004         // 屏幕录制授权被拒绝
  AUTH_ERROR: 10005                    // 推流服务器鉴权失败
  UNINITIALIZED: 20001                 // 未初始化
  INITIALIZED: 20002                    // 已初始化

三、完整使用流程(标准步骤)

步骤 1:引入依赖

在页面中导入推流相关 API:

import { initStream, startStream, openAppPermissionSettings, stopStream, checkPermissions } from "@/uni_modules/skyle-screen"

步骤 2:获取页面 Activity(必须)

推流需要依赖安卓页面上下文,必须先获取当前页面 Activity:

const pages = getCurrentPages()
const currentPage = pages[pages.length - 1] as UniPage
const activity = currentPage.getAndroidActivity()

if (activity == null) {
  console.error("获取Activity失败,无法初始化推流")
  return
}

步骤 3:初始化推流(initStream)

作用:创建推流实例、检查麦克风权限,初始化成功后才能开始推流。

配置:推流地址、音视频参数、监听初始化成功/失败、推流状态

initStream({
  // 必传参数
  activity: activity!,
  rtmpUrl: "你的RTMP推流地址",
  useMic: false, // 是否开启麦克风(true=开启,false=关闭)

  // 可选:视频参数(低码率推荐配置)
  videoWidth: 360,
  videoHeight: 640,
  videoBitrate: 500 * 1000, // 500kbps
  videoFps: 15,

  // 初始化成功:权限检查通过,调用开始推流
  onSuccess() {
    console.log("初始化成功,准备开始推流")
    startStream() // 自动开始推流
  },

  // 初始化/推流失败:统一错误处理
  onFailed: (code: number, msg: string) => {
    console.log("失败 code:", code, "msg:", msg)
    // 麦克风权限被拒 → 打开系统设置
    if (code === 10001) {
      openAppPermissionSettings()
    }
  },

  // 推流状态回调
  onConnected: () => {
    console.log("推流连接成功")
  },
  onDisconnected: () => {
    console.log("推流连接断开")
  }
})

步骤 4:开始推流(startStream)

  • 必须在 onSuccess 回调中调用
  • 会自动请求屏幕录制授权(用户同意后正式推流)

步骤 5:停止推流(stopStream)

页面卸载、手动停止时调用,自动释放资源、断开连接、停止服务:

function stop() {
  stopStream()
  console.log("🛑 已停止推流")
}

四、完整页面代码

<template>
    <view id="testId">
        <text>屏幕推流测试</text>
        <text @click="stop">停止推流</text>
    </view>
</template>

<script setup lang="uts">
    import { initStream, startStream, openAppPermissionSettings, stopStream } from "@/uni_modules/skyle-screen"

    // 停止推流
    function stop(){
        stopStream()
    }

    // 延迟初始化(保证页面加载完成)
    setTimeout(() => {
        // 1. 获取Activity
        const pages = getCurrentPages()
        const currentPage = pages[pages.length - 1] as UniPage
        const activity = currentPage.getAndroidActivity()

        if (activity == null) {
            console.error("获取Activity失败")
            return
        }

        // 2. 初始化推流
        initStream({
            activity: activity!,
            rtmpUrl: "rtmp://localhost/live/stream",
            useMic: false,
            videoWidth: 360,
            videoHeight: 640,
            videoBitrate: 500 * 1000,
            videoFps: 15,

            // 初始化成功 → 自动开始推流
            onSuccess() {
                startStream();
            },

            // 失败统一处理
            onFailed: (code : number, msg : string) => {
                console.log("推流失败 code:", code, "msg:", msg)
                if (code == 10001) {
                    openAppPermissionSettings()
                }
            },

            // 推流状态
            onConnected: () => {
                console.log("推流连接成功")
            },
            onDisconnected: () => {
                console.log("推流断开")
            }
        })

    }, 3000)
</script>

五、标准执行流程(时序)

页面加载 
  ↓
延迟获取当前页面 Activity
  ↓
调用 initStream → 创建推流实例
  ↓
检查麦克风权限
  ├─ 有权限 / 关闭麦克风 → 触发 onSuccess
  └─ 无权限 → 触发 onFailed(10001)
       ↓
onSuccess 回调 → 调用 startStream()
       ↓
请求屏幕录制授权
  ├─ 用户同意 → 开始推流,触发 onConnected
  └─ 用户拒绝 → 触发 onFailed(10004)
       ↓
推流中 → 正常传输音视频数据
       ↓
手动调用 stopStream → 停止推流、释放所有资源

六、常见问题处理

错误码 问题描述 解决方案
10001 麦克风权限被拒 引导用户打开权限设置
10004 屏幕录制授权被拒 无法推流,需重新请求授权
10005 RTMP 地址/鉴权失败 检查推流地址是否正确

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。