2013-02-08 40 views

Trả lời

48

Đây là thứ mà tôi đã dành cả ngày để xé tóc ra. Dựa trên các bit mã khác nhau trên web tôi đã quản lý để làm cho nó hoạt động.

Trước tiên, bạn cần tạo lớp tùy chỉnh WebChromeClient, thực hiện các phương thức onShowCustomViewonHideCustomView.

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); 
     } 
    } 
} 

Về cơ bản, điều xảy ra ở đây là khi nhấn nút toàn màn hình, chúng tôi đang tạo chế độ xem mới để giữ video và ẩn chế độ xem chính. Và sau đó khi toàn màn hình được đóng lại, chúng tôi làm ngược lại - loại bỏ chế độ xem mới và hiển thị chế độ xem gốc.

Bạn sẽ cũng cần phải thêm tất cả những thuộc tính cho lớp hoạt động của bạn:

private MyWebChromeClient mWebChromeClient = null; 
private View mCustomView; 
private RelativeLayout mContentView; 
private FrameLayout mCustomViewContainer; 
private WebChromeClient.CustomViewCallback mCustomViewCallback; 

Và có thể bạn muốn làm cho nó đóng video toàn màn hình khi vào nút quay lại được nhấn:

@Override 
public void onBackPressed() { 
    if (mCustomViewContainer != null) 
     mWebChromeClient.onHideCustomView(); 
    else if (myWebView.canGoBack()) 
     myWebView.goBack(); 
    else 
     super.onBackPressed(); 
} 

Sau đó, việc sử dụng lớp học mới của bạn chỉ là vấn đề khi bạn tạo chế độ xem web của mình:

myWebView = (WebView) findViewById(R.id.webView1); 
mWebChromeClient = new WMWebChromeClient(); 
myWebView.setWebChromeClient(mWebChromeClient); 

Điều này làm việc cho tôi trên Android 4.x. Không chắc chắn về các phiên bản trước đó vì ứng dụng của tôi không nhắm mục tiêu đến chúng.

tôi tìm thấy những liên kết này đặc biệt hữu ích: WebView and HTML5 <video>http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org/itri/html5webview/HTML5WebView.java

+0

Trong mẫu mã của bạn, mContentView là gì trong bối cảnh của một cái nhìn cho toàn màn hình? Tôi tưởng tượng đó là một loại bố trí bạn đã tăng cao, nhưng làm thế nào bạn làm cho nó toàn màn hình. Bạn có thể đăng XML cho đối tượng mContentView của mình không? –

+0

'mContentView' là chế độ xem hoạt động chính, được ẩn khi video được tạo chế độ toàn màn hình. Tôi không tự động tạo video toàn màn hình; người dùng làm điều đó (nếu họ muốn) khi xem video. –

+0

@MarkParnell Xin vui lòng cho ý kiến ​​của bạn ở đây cũng http://stackoverflow.com/questions/18533678/playing-youtube-videos-smoothly-in-web-view – anshul

0

Bạn có thể bắt đầu một ứng dụng YouTube ngoài khi bạn sẽ Cath thông tin về video URLif nó không phải là điều quan trọng để hiển thị video YouTube trực tiếp trong ứng dụng.

Để bắt URL thông tin video Bạn cần phải owerride onLoadResource phương pháp:

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); 
     } 
    } 
} 
+0

Đẹp mã, nhưng khi tôi bấm vào video nó cũng bắt đầu chơi trong webview, làm thế nào tôi có thể hủy bỏ điều đó? – KiKo

+0

Bạn có thể gọi WebView.reload(). Nhưng bạn có thể thực hiện video toàn màn hình trực tiếp trong ứng dụng nếu bạn không cần phải bắt đầu ứng dụng nước ngoài. –

+0

Làm cách nào tôi có thể làm điều đó ..? Một số mã ví dụ ... – KiKo

Các vấn đề liên quan