2012-10-23 28 views
15

現在、ウェブサイトに基づいてAndroidアプリケーションを開発中です。 iOSアプリケーションはすでに存在しており、コードの統一性を尊重する必要があります。Androidウェブビューでiframe動画がフルスクリーンモードにならない

私はちょうど興味深い問題を発見しました:iframeビデオ(Youtube、Dailymotion)を持つページのwebview(私は表示されたページで何もコントロールしていません)を使用すると、私はプレーヤーのボタンを押しているにもかかわらず、フルスクリーンになる。

私はすでにここで見つかったすべてのものを試しましたが、表示する必要があるページが分かっているアプリのみを参照しています。ここで

は、アプリのwebActivity部分のコードは次のとおりです。任意のヘルプ

public class WebActivity extends Activity { 
    String targetURL = ""; 
    String title = ""; 
    WebView wv; 

    @Override 
    public void onResume() { super.onResume(); CookieSyncManager.getInstance().startSync(); } 
    @Override 
    public void onPause() { super.onPause(); CookieSyncManager.getInstance().stopSync(); } 

    /** Called when the activity is first created. */ 
    @SuppressLint("SetJavaScriptEnabled") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     //getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     CookieSyncManager.createInstance(getApplicationContext()); 
     CookieSyncManager.getInstance().startSync(); 
     CookieManager.getInstance().setAcceptCookie(true); 
     /** 
     * TODO: WebView Cookie management. 
     * Right now, a cookie is hardcoded here into the WebView instead of getting it from the API called by HttpClient when retrieving the JSON. 
     * Need to make things cleaner. 
     */ 
     CookieManager.getInstance().setCookie("http://www.blabla.fr/mobile/","gbapi=1; Domain=.www.blabla.fr"); 
     /** 
     * Get parameters 
     */ 
     Bundle b = getIntent().getExtras(); 
     if(b != null) 
     { 
      targetURL = b.getString("url"); 
      title = b.getString("title"); 
     } 

     setTitle(title); 
     setContentView(R.layout.activity_webview); 

     wv = (WebView) findViewById(R.id.webview); 

     WebSettings wvSettings = wv.getSettings(); 

     // WebView options 
     wvSettings.setDefaultTextEncodingName("utf-8"); 
     wvSettings.setJavaScriptEnabled(true); 
     wvSettings.setPluginState(PluginState.ON); 
     wvSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
     wvSettings.setBuiltInZoomControls(true); 
     final Activity activity = this; 
     wv.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 
       activity.setProgress(progress * 100); 
      } 
     }); 

     wv.setWebViewClient(new WebViewClient() { 
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Toast.makeText(activity, "Oh snap! " + description, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     wv.loadUrl(targetURL); 
    } 
} 

感謝。

答えて

2

onShowCustomViewの両方のバージョン(このコールバックの新しいバージョンはAPIレベル14で導入されました)とonHideCustomViewを処理するカスタムWebChromeClientを作成する必要があります。基本的には、ビデオをフルスクリーンで再生しようとすると、VideoViewのバリエーションであるビューが表示されます。これをフルスクリーンのFrameLayoutにアタッチし、レイアウト階層のルートに貼り付けて画面全体をオーバーレイする必要があります。完了したら、もう一度削除する必要があります。ここで

は、それが添付できるよう、私は活動とそれ緊密に結合するために持っていた、それは本当にフルスクリーンにするために、私は断片内にこれをやっている動画

private class DerpChromeClient extends WebChromeClient implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { 
    //@Override 
    public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) { 
     log.warn("onShowCustomView"); 
     showCustomView(view, callback); 
    } 

    private View mVideoProgressView; 

    @Override 
    public void onHideCustomView() { 
     super.onHideCustomView(); 

     activity.removeFullscreenView(); 
     webView.setVisibility(View.VISIBLE); 

     try { 
      mCustomViewCallback.onCustomViewHidden(); 
     } catch (NullPointerException npe) { 
      // occasionally Android likes to freak out and throw an unhandled NPE if it can't play the video 
      // therefore we are not going to do anything but eat this exception so it fails gracefully 
     } 

     mCustomView = null; 
     mVideoView = null; 
    } 

    @Override 
    public void onShowCustomView(View view, CustomViewCallback callback) { 
     super.onShowCustomView(view, callback); 
     log.warn("onShowCustomView"); 
     showCustomView(view, callback); 
    } 

    private void showCustomView(View view, CustomViewCallback callback) { 
     if (mCustomView != null) { 
      callback.onCustomViewHidden(); 
      return; 
     } 

     mCustomView = view; 
     mCustomViewCallback = callback; 
     webView.setVisibility(View.GONE); 

     if (view instanceof FrameLayout) { 
      if (((FrameLayout)view).getFocusedChild() instanceof VideoView) { 
       mVideoView = (VideoView)((FrameLayout)view).getFocusedChild(); 
      } 
     } 

     view.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); 
     view.setBackgroundColor(Color.BLACK); 
     activity.displayFullscreenView(view); 
    } 

    @Override 
    public boolean onConsoleMessage(ConsoleMessage cm) { 
     log.warn("Console Message: " + cm.message() + " on line " + cm.lineNumber() + " of " + cm.sourceId()); 
     return super.onConsoleMessage(cm); 
    } 

    @Override 
    public void onProgressChanged(WebView view, int newProgress) { 
     super.onProgressChanged(view, newProgress); 

     if (newProgress < 100) { 
      if (loadingProgress.getVisibility() == ProgressBar.GONE) { 
       loadingProgress.setVisibility(ProgressBar.VISIBLE); 
      } 
      loadingProgress.setProgress(newProgress); 
     } else if (newProgress >= 100) { 
      loadingProgress.setVisibility(ProgressBar.GONE); 
     } 
    } 

    @Override 
    public View getVideoLoadingProgressView() { 
     if (mVideoProgressView == null) { 
      LayoutInflater inflater = LayoutInflater.from(KnowledgeBaseFragment.this.getActivity().getApplicationContext()); 
      mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null); 
     } 

     return mVideoProgressView; 
    } 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     this.onHideCustomView(); 
    } 
} 

注意を再生するために使用していたバージョンですフラグメント階層だけでなく、ビュー階層全体のルートにあるFrameLayoutここで

それらの機能です:WebView and HTML5 <video>

+1

私は数ヶ月でこのコードを見ていない:

@Override public void displayFullscreenView(View customView) { parentLayout.addView(customView); this.customView = customView; } @Override public void removeFullscreenView() { if (customView != null) { customView.setVisibility(View.GONE); parentLayout.removeView(customView); } customView = null; } 

ここであなたのような別の質問です。多くの半分の手術と残りの変数。 ><これをきれいにする時間。 – MattC

+1

ありがとう!私はコードをちょっと微調整しなければならなかったが、それを使うことができた。 – Pascal

関連する問題