2011-12-28 123 views
2

所以我创建了一个Android应用程序,从blip.tv和其他各种支持Flash的网站上播放视频。我使用Webview来显示视频。这里是我的代码:flash播放器崩溃4.0

try{ 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 


     view = new WebView(this); 
     view.getSettings().setPluginsEnabled(true); 
     view.getSettings().setPluginState(WebSettings.PluginState.ON); 

     view.getSettings().setJavaScriptEnabled(true); 
     view.getSettings().setLoadWithOverviewMode(true); 
     view.getSettings().setUseWideViewPort(true); 
     view.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
     view.setScrollbarFadingEnabled(true); 


     // get the html code 
     String html = getIntent().getStringExtra("VIDEO_CONTENT"); 

     view.loadData(html, "text/html", null); 
     setContentView(view); 
    } 
    catch(Exception e){ 

    } 

问题是与Android 4(冰淇淋三明治)。当我尝试将应用程序置于全屏模式时,应用程序崩溃。然而,该应用不会在android 2.3或3.0上崩溃。任何想法来解决这个问题?

回答

1

好了,所以我觉得这是一个Android 4.0.2/Flash播放器的问题,因为其他应用程序,如browserdolphin mini崩溃时,闪光灯被置于全屏模式。

4

这发生在ICS中,因为android.webkit.PluginFullScreenHolder中的show()方法在尝试转到全屏模式时被调用。此方法执行以下操作:

WebChromeClient client = mWebView.getWebChromeClient(); 
client.onShowCustomView(mLayout, mOrientation, mCallback); 

如果不设置WebChromeClientWebView,你会得到一个NPE。

这种固定我们的崩溃,但是WebView中消失,全屏视频没有显示。

参见:Android ICS 4.0 Placing Flash WebView into full screen calls hideAll Method?

***更新:

最终,为了得到我的WebView播放Flash影片在全屏模式下,我不得不实施onShowCustomView()方法在我WebChromeClient类似的方式到在Android浏览器的源代码中完成了什么。我用灵感该方法的实现是在BaseUI类:

https://github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/BaseUi.java

我不完全明白到底这里发生了什么。我也希望我明白为什么ICS的开发者决定要求实施这种方法。我希望我知道价值,或者解决了什么问题。在过去的版本中,这种全屏模式“刚刚工作”,现在需要大量的挖掘。

+0

酷感谢我给这是一个尝试。 – Darcy 2012-02-07 22:38:30

+2

能否请您通过上面我终于取得了Flash播放视频全屏代码共享您的解决方案,谢谢 – user634545 2012-03-14 11:14:40

2

我面临同样的问题。我询问并得到了适合我的以下答案。
希望这将帮助一些人:
创建FullscreenableChromeClient和 加入这一行:

WebView.setWebChromeClient(new FullscreenableChromeClient(this)); 


public class FullscreenableChromeClient extends WebChromeClient { 
     protected Activity mActivity = null; 

     private View mCustomView; 
     private WebChromeClient.CustomViewCallback mCustomViewCallback; 
     private int mOriginalOrientation; 

     private FrameLayout mContentView; 
     private FrameLayout mFullscreenContainer; 

     private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 

     public FullscreenableChromeClient(Activity activity) { 
      this.mActivity = activity; 
     } 

     @Override 
     public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
       if (mCustomView != null) { 
        callback.onCustomViewHidden(); 
        return; 
       } 

       mOriginalOrientation = mActivity.getRequestedOrientation(); 
       FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView(); 
       mFullscreenContainer = new FullscreenHolder(mActivity); 
       mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS); 
       decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS); 
       mCustomView = view; 
       setFullscreen(true); 
       mCustomViewCallback = callback; 
       mActivity.setRequestedOrientation(requestedOrientation); 
      } 

      super.onShowCustomView(view, requestedOrientation, callback); 
     } 

     @Override 
     public void onHideCustomView() { 
      if (mCustomView == null) { 
       return; 
      } 

      setFullscreen(false); 
      FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView(); 
      decor.removeView(mFullscreenContainer); 
      mFullscreenContainer = null; 
      mCustomView = null; 
      mCustomViewCallback.onCustomViewHidden(); 
      mActivity.setRequestedOrientation(mOriginalOrientation); 
     } 

     private void setFullscreen(boolean enabled) { 
      Window win = mActivity.getWindow(); 
      WindowManager.LayoutParams winParams = win.getAttributes(); 
      final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN; 
      if (enabled) { 
       winParams.flags |= bits; 
      } else { 
       winParams.flags &= ~bits; 
       if (mCustomView != null) { 
        mCustomView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 
       } else { 
        mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 
       } 
      } 
      win.setAttributes(winParams); 
     } 

     private static class FullscreenHolder extends FrameLayout { 
      public FullscreenHolder(Context ctx) { 
       super(ctx); 
       setBackgroundColor(ctx.getResources().getColor(android.R.color.black)); 
      } 

      @Override 
      public boolean onTouchEvent(MotionEvent evt) { 
      return true; 
     } 
    } 
} 
+1

。 – 2013-06-27 18:32:56