Androidブログをロードするwordpress webviewがあります。一部のブログ投稿にはユーチューブビデオが含まれており、ユーザーが希望する場合は全画面表示できるようにしたいと考えています。問題は、クリックしてもHTML5全画面ボタンが何もしないのにビューがフリーズすることです。何か案は?
これは私が最後の日かそこらで髪を引き裂いて過ごしたものです。ウェブ上のさまざまなコードに基づいて、私はなんとか動作させることができました。
最初に、WebChromeClient
およびonShowCustomView
メソッドを実装するカスタムonHideCustomView
クラスを作成する必要があります。
private class MyWebChromeClient extends WebChromeClient {
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mContentView = (RelativeLayout) findViewById(R.id.activity_main);
mContentView.setVisibility(View.GONE);
mCustomViewContainer = new FrameLayout(MainActivity.this);
mCustomViewContainer.setLayoutParams(LayoutParameters);
mCustomViewContainer.setBackgroundResource(Android.R.color.black);
view.setLayoutParams(LayoutParameters);
mCustomViewContainer.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mCustomViewContainer.setVisibility(View.VISIBLE);
setContentView(mCustomViewContainer);
}
@Override
public void onHideCustomView() {
if (mCustomView == null) {
return;
} else {
// Hide the custom view.
mCustomView.setVisibility(View.GONE);
// Remove the custom view from its container.
mCustomViewContainer.removeView(mCustomView);
mCustomView = null;
mCustomViewContainer.setVisibility(View.GONE);
mCustomViewCallback.onCustomViewHidden();
// Show the content view.
mContentView.setVisibility(View.VISIBLE);
setContentView(mContentView);
}
}
}
基本的に、ここで行われているのは、全画面ボタンが押されたときです。ビデオを保持するための新しいビューを作成し、メインビューを非表示にします。そして、フルスクリーンが閉じられると、反対のことを行います-新しいビューを取り除き、元のビューを表示します。
また、これらのすべてのプロパティをアクティビティクラスに追加する必要があります。
private MyWebChromeClient mWebChromeClient = null;
private View mCustomView;
private RelativeLayout mContentView;
private FrameLayout mCustomViewContainer;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
そして、おそらく戻るボタンが押されたときにフルスクリーンビデオを閉じたいと思うでしょう:
@Override
public void onBackPressed() {
if (mCustomViewContainer != null)
mWebChromeClient.onHideCustomView();
else if (myWebView.canGoBack())
myWebView.goBack();
else
super.onBackPressed();
}
次に、Webビューを作成するときに新しいクラスを使用するだけです。
myWebView = (WebView) findViewById(R.id.webView1);
mWebChromeClient = new WMWebChromeClient();
myWebView.setWebChromeClient(mWebChromeClient);
これはAndroid 4.x.で動作します。アプリがターゲットにしないため、以前のバージョンについてはわかりません。
これらのリンクは特に便利だと思いました: WebView and HTML5 <video> and http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org /itri/html5webview/HTML5WebView.Java
アプリケーションで直接YouTubeビデオを表示することが重要でない場合は、ビデオ情報URLを取得するときに外部YouTubeアプリを起動できます。
ビデオ情報のURLをキャッチするには、onLoadResource
メソッドを使用する必要があります。
new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
if (url.startsWith("http://www.youtube.com/get_video_info?")) {
try {
String path = url.replace("http://www.youtube.com/get_video_info?", "");
String[] parqamValuePairs = path.split("&");
String videoId = null;
for (String pair : parqamValuePairs) {
if (pair.startsWith("video_id")) {
videoId = pair.split("=")[1];
break;
}
}
if(videoId != null){
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com"))
.setData(Uri.parse("http://www.youtube.com/watch?v=" + videoId)));
needRefresh = true;
return;
}
} catch (Exception ex) {
}
} else {
super.onLoadResource(view, url);
}
}
}