Android WebView - Youtube 视频未在应用程序中播放
Android WebView - Youtube videos not playing within the application
我有一个 activity 正在使用 WebView 显示网页。在该页面中,有一个指向 YouTube 视频的 link(所以它不是我可以或不需要嵌入的视频)。
问题是视频无法播放 - 当我点击播放按钮时,出现一个错误页面说
“ 网页无法显示
vnd.youtube:SVf8Ghl6d8xx 的网页
可能会暂时关闭等等等等等等!!!"
如果你知道我想要什么,请只回答!我几乎浏览了所有关于 Whosebug 的相关帖子,因此不需要参考其他 posts/question.
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// add the custom view to the action bar
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2)
webView.getSettings().setPluginState(WebSettings.PluginState.ON); //Helps flash run on a device
webView.getSettings().setBuiltInZoomControls(true);
webView.setWebViewClient(new WebViewClient ());
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setUseWideViewPort(true);
//webView.getSettings().setUseWideViewPort(false);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadUrl(url);
}
以下代码在 youtube 应用程序中使其成为 运行 但我希望视频在我的应用程序中成为 运行 :(
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// add the custom view to the action bar
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2)
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.setWebViewClient(new WebViewClient () {
@ Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("vnd.youtube")){
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
else return false;
}
});
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setUseWideViewPort(true);
//webView.getSettings().setUseWideViewPort(false);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadUrl(url);
}
在应用程序中嵌入 YouTube 视频的最佳方式是使用 Youtube API
The YouTube Android Player API enables you to incorporate video
playback functionality into your Android applications. The API defines
methods for loading and playing YouTube videos (and playlists) and for
customizing and controlling the video playback experience.
转到 Google 开发者控制台并 select 或创建一个新项目。
在左侧边栏中,APIs 下的 select APIs & auth 并打开 YouTube 数据 API v3 的状态。
在左侧栏中,select 凭据和在 Public API 访问下创建新密钥。
当弹出窗口要求您选择平台时,select Android 键。
粘贴 SHA-1 密钥和项目的包名称,用分号 (;) 分隔。
点击创建。现在您应该在仪表板上看到 API KEY。
从这里下载 YouTubeAPIjar
https://developers.google.com/youtube/android/player/downloads/
创建这样的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube_player"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:layout_centerInParent="true" />
</RelativeLayout>
您的 activity 应该看起来像这样
public class CustomYouTubePlayer extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener{
private String API_KEY="your key";
private String VIDEO_ID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** attaching layout xml **/
setContentView(R.layout.youtube_player);
/** Initializing YouTube player view **/
VIDEO_ID = getIntent().getExtras().getString(FinalVariables.YOUTUBE_ID);
YouTubePlayerView youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_player);
youTubePlayerView.initialize(API_KEY, this);
}
@Override
public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
player.setShowFullscreenButton(false);
/** add listeners to YouTubePlayer instance **/
player.setPlayerStateChangeListener(playerStateChangeListener);
player.setPlaybackEventListener(playbackEventListener);
/** Start buffering **/
if (!wasRestored) {
player.loadVideo(VIDEO_ID);
}
}
private YouTubePlayer.PlaybackEventListener playbackEventListener = new YouTubePlayer.PlaybackEventListener() {
@Override
public void onBuffering(boolean arg0) {
}
@Override
public void onPaused() {
}
@Override
public void onPlaying() {
}
@Override
public void onSeekTo(int arg0) {
}
@Override
public void onStopped() {
}
};
private YouTubePlayer.PlayerStateChangeListener playerStateChangeListener = new YouTubePlayer.PlayerStateChangeListener() {
@Override
public void onAdStarted() {
}
@Override
public void onError(YouTubePlayer.ErrorReason arg0) {
}
@Override
public void onLoaded(String arg0) {
}
@Override
public void onLoading() {
}
@Override
public void onVideoEnded() {
finish();
}
@Override
public void onVideoStarted() {
}
};
}
只需传递视频 ID,就这么简单..
编辑
如果这是你的 YouTube link https://www.youtube.com/watch?v=rql_F8H3h9E
那么你的 video_id=rql_F8H3h9E
从 YouTube link 中提取您的视频 ID,并将其作为额外变量发送至此 activity。
为此,您需要将嵌入的 YouTube 视频的 iFrame 代码转换为字符串,并将其作为字符串加载到应用程序中的 webview。
例如,
String frameVideo = "<html><body>Youtube video .. <br> <iframe width="320" height="315" src="https://www.youtube.com/embed/lY2H2ZP56K4" frameborder="0" allowfullscreen></iframe></body></html>";
然后在所有正常的 webview 设置之后将其加载到您的 webview
WebView displayVideo = (WebView)findViewById(R.id.webView);
displayVideo.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
WebSettings webSettings = displayVideo.getSettings();
webSettings.setJavaScriptEnabled(true);
displayVideo.loadData(frameVideo, "text/html", "utf-8");
我有一个 activity 正在使用 WebView 显示网页。在该页面中,有一个指向 YouTube 视频的 link(所以它不是我可以或不需要嵌入的视频)。
问题是视频无法播放 - 当我点击播放按钮时,出现一个错误页面说 “ 网页无法显示 vnd.youtube:SVf8Ghl6d8xx 的网页 可能会暂时关闭等等等等等等!!!"
如果你知道我想要什么,请只回答!我几乎浏览了所有关于 Whosebug 的相关帖子,因此不需要参考其他 posts/question.
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// add the custom view to the action bar
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2)
webView.getSettings().setPluginState(WebSettings.PluginState.ON); //Helps flash run on a device
webView.getSettings().setBuiltInZoomControls(true);
webView.setWebViewClient(new WebViewClient ());
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setUseWideViewPort(true);
//webView.getSettings().setUseWideViewPort(false);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadUrl(url);
}
以下代码在 youtube 应用程序中使其成为 运行 但我希望视频在我的应用程序中成为 运行 :(
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// add the custom view to the action bar
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2)
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.setWebViewClient(new WebViewClient () {
@ Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("vnd.youtube")){
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
else return false;
}
});
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setUseWideViewPort(true);
//webView.getSettings().setUseWideViewPort(false);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.loadUrl(url);
}
在应用程序中嵌入 YouTube 视频的最佳方式是使用 Youtube API
The YouTube Android Player API enables you to incorporate video playback functionality into your Android applications. The API defines methods for loading and playing YouTube videos (and playlists) and for customizing and controlling the video playback experience.
转到 Google 开发者控制台并 select 或创建一个新项目。
在左侧边栏中,APIs 下的 select APIs & auth 并打开 YouTube 数据 API v3 的状态。
在左侧栏中,select 凭据和在 Public API 访问下创建新密钥。
当弹出窗口要求您选择平台时,select Android 键。
粘贴 SHA-1 密钥和项目的包名称,用分号 (;) 分隔。
点击创建。现在您应该在仪表板上看到 API KEY。
从这里下载 YouTubeAPIjar
https://developers.google.com/youtube/android/player/downloads/
创建这样的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube_player"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:layout_centerInParent="true" />
</RelativeLayout>
您的 activity 应该看起来像这样
public class CustomYouTubePlayer extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener{
private String API_KEY="your key";
private String VIDEO_ID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** attaching layout xml **/
setContentView(R.layout.youtube_player);
/** Initializing YouTube player view **/
VIDEO_ID = getIntent().getExtras().getString(FinalVariables.YOUTUBE_ID);
YouTubePlayerView youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_player);
youTubePlayerView.initialize(API_KEY, this);
}
@Override
public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
player.setShowFullscreenButton(false);
/** add listeners to YouTubePlayer instance **/
player.setPlayerStateChangeListener(playerStateChangeListener);
player.setPlaybackEventListener(playbackEventListener);
/** Start buffering **/
if (!wasRestored) {
player.loadVideo(VIDEO_ID);
}
}
private YouTubePlayer.PlaybackEventListener playbackEventListener = new YouTubePlayer.PlaybackEventListener() {
@Override
public void onBuffering(boolean arg0) {
}
@Override
public void onPaused() {
}
@Override
public void onPlaying() {
}
@Override
public void onSeekTo(int arg0) {
}
@Override
public void onStopped() {
}
};
private YouTubePlayer.PlayerStateChangeListener playerStateChangeListener = new YouTubePlayer.PlayerStateChangeListener() {
@Override
public void onAdStarted() {
}
@Override
public void onError(YouTubePlayer.ErrorReason arg0) {
}
@Override
public void onLoaded(String arg0) {
}
@Override
public void onLoading() {
}
@Override
public void onVideoEnded() {
finish();
}
@Override
public void onVideoStarted() {
}
};
}
只需传递视频 ID,就这么简单..
编辑
如果这是你的 YouTube link https://www.youtube.com/watch?v=rql_F8H3h9E 那么你的 video_id=rql_F8H3h9E 从 YouTube link 中提取您的视频 ID,并将其作为额外变量发送至此 activity。
为此,您需要将嵌入的 YouTube 视频的 iFrame 代码转换为字符串,并将其作为字符串加载到应用程序中的 webview。
例如,
String frameVideo = "<html><body>Youtube video .. <br> <iframe width="320" height="315" src="https://www.youtube.com/embed/lY2H2ZP56K4" frameborder="0" allowfullscreen></iframe></body></html>";
然后在所有正常的 webview 设置之后将其加载到您的 webview
WebView displayVideo = (WebView)findViewById(R.id.webView);
displayVideo.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
WebSettings webSettings = displayVideo.getSettings();
webSettings.setJavaScriptEnabled(true);
displayVideo.loadData(frameVideo, "text/html", "utf-8");