You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Android YouTube播放的视频URL传递至Kotlin应用Activity?

实现Android YouTube播放器视频URL传递到Kotlin应用Activity的方案

由于Android系统的安全限制,第三方应用无法直接读取YouTube应用的内部数据,需要通过辅助功能服务或媒体会话监听两种间接方案实现,以下是具体步骤:


方案一:辅助功能服务(稳定性更高)

该方案通过监听YouTube的UI元素操作,提取视频分享链接,是目前较可靠的方式。

1. 创建Accessibility Service类

继承AccessibilityService,重写事件处理方法,监听YouTube界面变化并提取视频信息:

class YouTubeAccessibilityService : AccessibilityService() {
    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
        event ?: return
        // 仅处理YouTube应用事件
        if (event.packageName != "com.google.android.youtube") return

        val rootNode = rootInActiveWindow ?: return
        // 查找分享按钮节点
        findShareButton(rootNode)?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
    }

    // 递归查找分享按钮
    private fun findShareButton(node: AccessibilityNodeInfo): AccessibilityNodeInfo? {
        for (i in 0 until node.childCount) {
            val child = node.getChild(i) ?: continue
            if (child.contentDescription?.contains("分享") == true) return child
            findShareButton(child)?.let { return it }
        }
        return null
    }

    override fun onInterrupt() {}
}

2. 配置Manifest文件

必须在Manifest中注册服务并声明权限,这是之前可能出错的关键:

<service
    android:name=".YouTubeAccessibilityService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_service_config" />
</service>

3. 创建辅助功能配置文件

在res/xml目录下新建accessibility_service_config.xml,指定监听范围:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowStateChanged|typeViewClicked"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_desc"
    android:packageNames="com.google.android.youtube" />

在strings.xml添加服务描述:

<string name="accessibility_desc">获取YouTube当前播放视频链接,用于传递至我的应用</string>

4. 引导用户开启权限

辅助功能需要用户手动在系统设置中开启,添加跳转代码:

fun openAccessibilitySettings(context: Context) {
    val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
    context.startActivity(intent)
}

方案二:监听媒体会话(依赖YouTube版本)

YouTube会通过系统媒体会话发布播放信息,可提取视频ID并拼接成URL:

1. 注册媒体会话回调

使用MediaBrowserServiceCompat监听媒体会话状态:

class MediaSessionMonitor(context: Context) {
    private val mediaBrowser = MediaBrowserCompat(
        context,
        ComponentName("com.google.android.youtube", "com.google.android.youtube.playback.MediaBrowserService"),
        object : MediaBrowserCompat.ConnectionCallback() {
            override fun onConnected() {
                val controller = MediaControllerCompat(context, mediaBrowser.sessionToken)
                controller.registerCallback(object : MediaControllerCompat.Callback() {
                    override fun onMetadataChanged(metadata: MediaMetadataCompat?) {
                        metadata ?: return
                        // 提取视频ID并拼接URL
                        val videoId = metadata.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID)
                        val videoUrl = "https://www.youtube.com/watch?v=$videoId"
                        // 传递到目标Activity
                        val intent = Intent(context, YourTargetActivity::class.java)
                        intent.putExtra("YOUTUBE_URL", videoUrl)
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                        context.startActivity(intent)
                    }
                })
            }
        },
        null
    )

    fun startMonitoring() = mediaBrowser.connect()
    fun stopMonitoring() = mediaBrowser.disconnect()
}

关键问题解答

  • 是否需要Service? 是的:方案一需要Accessibility Service,方案二需要MediaBrowserServiceCompat(属于Service范畴),因为需要后台持续监听其他应用状态。
  • Manifest配置失败的常见原因:
    • 未添加BIND_ACCESSIBILITY_SERVICE权限
    • 辅助功能配置文件的packageNames未指定YouTube包名com.google.android.youtube
    • 用户未在系统设置中开启对应辅助功能(Manifest配置正确也需要手动授权)

传递URL到目标Activity

获取到URL后,通过Intent传递:

// 获取URL后调用
val intent = Intent(this, YourTargetActivity::class.java)
intent.putExtra("YOUTUBE_VIDEO_URL", videoUrl)
startActivity(intent)

在目标Activity中接收:

val videoUrl = intent.getStringExtra("YOUTUBE_VIDEO_URL")
// 后续业务处理

内容的提问来源于stack exchange,提问作者ITSServiceScherer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:41:12