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

Android应用播放URL视频问题:YouTube链接无法正常播放

解决Android VideoView无法播放YouTube URL的问题

嘿,这个问题我之前也碰到过!你的代码没法播放YouTube链接的原因很简单:VideoView只能直接播放媒体文件的直链(比如你提到的.mp4文件),而YouTube的https://www.youtube.com/watch?v=QQKdFFRqamg是网页地址,不是视频文件的直接流地址,系统的MediaPlayer根本解析不了这个网页内容,所以才会抛出那个FileNotFoundException。

下面给你几个靠谱的解决方案,按推荐程度排序:

方案1:用官方YouTube Android Player API(最推荐)

这是YouTube官方提供的嵌入播放方案,合规又稳定,不会有版权或者失效的问题。步骤大概是这样:

  1. 先去Google开发者控制台创建项目,启用YouTube Data API v3,拿到你的API密钥
  2. 在app的build.gradle里加依赖:
    implementation 'com.google.android.youtube:youtube-android-player:10.0.1'
    
  3. 布局里放个YouTubePlayerView:
    <com.google.android.youtube.player.YouTubePlayerView
        android:id="@+id/youtube_player"
        android:layout_width="match_parent"
        android:layout_height="250dp"/>
    
  4. 然后在Activity里实现初始化逻辑:
    public class VideoPlayerActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
        private static final String YOUR_API_KEY = "替换成你的API密钥";
        private static final String VIDEO_ID = "QQKdFFRqamg"; // 从URL里提取的视频ID
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_video_player);
    
            YouTubePlayerView playerView = findViewById(R.id.youtube_player);
            playerView.initialize(YOUR_API_KEY, this);
        }
    
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
            if (!wasRestored) {
                player.loadVideo(VIDEO_ID); // 直接播放
                // 要是不想自动播,就用player.cueVideo(VIDEO_ID);
            }
        }
    
        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) {
            if (errorReason.isUserRecoverableError()) {
                errorReason.getErrorDialog(this, 1).show();
            } else {
                Toast.makeText(this, "播放器初始化失败:" + errorReason.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
    }
    
    记得要给应用加INTERNET权限,在AndroidManifest.xml里加上:
    <uses-permission android:name="android.permission.INTERNET"/>
    

方案2:用WebView加载嵌入页面(简单快捷)

如果不想折腾官方API,用WebView也是个办法,直接加载YouTube的嵌入页面就行,体验也还不错:

  1. 布局里加WebView:
    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
  2. Activity里配置WebView:
    WebView webView = findViewById(R.id.web_view);
    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true); // 必须开JS,YouTube页面依赖这个
    settings.setDomStorageEnabled(true);
    settings.setLoadWithOverviewMode(true);
    settings.setUseWideViewPort(true);
    
    // 用嵌入链接比直接加载watch页面体验更好
    String videoId = "QQKdFFRqamg";
    String embedUrl = "https://www.youtube.com/embed/" + videoId;
    webView.loadUrl(embedUrl);
    
    // 可选:处理全屏播放的逻辑
    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            // 这里可以写全屏的逻辑,比如隐藏状态栏、切换布局
            super.onShowCustomView(view, callback);
        }
    
        @Override
        public void onHideCustomView() {
            // 退出全屏的恢复逻辑
            super.onHideCustomView();
        }
    });
    
    这个方案不用API密钥,代码也简单,但播放流畅度可能不如官方API,而且受WebView版本影响。

方案3:提取视频直链(非常不推荐)

网上有些第三方库能提取YouTube视频的直链,然后用VideoView播放,但这种方式完全违反YouTube的服务条款,而且YouTube经常改加密方式,这些库很容易失效,搞不好你的应用还会被Google Play下架,所以绝对不建议用这个方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:30:25