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官方提供的嵌入播放方案,合规又稳定,不会有版权或者失效的问题。步骤大概是这样:
- 先去Google开发者控制台创建项目,启用YouTube Data API v3,拿到你的API密钥
- 在app的
build.gradle里加依赖:implementation 'com.google.android.youtube:youtube-android-player:10.0.1' - 布局里放个
YouTubePlayerView:<com.google.android.youtube.player.YouTubePlayerView android:id="@+id/youtube_player" android:layout_width="match_parent" android:layout_height="250dp"/> - 然后在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的嵌入页面就行,体验也还不错:
- 布局里加WebView:
<WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"/> - Activity里配置WebView:
这个方案不用API密钥,代码也简单,但播放流畅度可能不如官方API,而且受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(); } });
方案3:提取视频直链(非常不推荐)
网上有些第三方库能提取YouTube视频的直链,然后用VideoView播放,但这种方式完全违反YouTube的服务条款,而且YouTube经常改加密方式,这些库很容易失效,搞不好你的应用还会被Google Play下架,所以绝对不建议用这个方法。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

