【问题标题】:flash player crashes when trying to enter fullscreen mode android 4.0尝试进入全屏模式android 4.0时Flash播放器崩溃
【发布时间】:2011-12-28 20:25:29
【问题描述】:

所以我创建了一个安卓应用程序,可以播放来自 blip.tv 和其他各种支持 Flash 的网站的视频。我使用Webview 来显示视频。这是我的代码:

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 上崩溃。有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: flash android-4.0-ice-cream-sandwich


    【解决方案1】:

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

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

    如果你没有在你的WebView 上设置WebChromeClient,你会得到一个NPE。

    这解决了我们的崩溃问题,但是 WebView 消失了,并且没有显示全屏视频。

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

    *** 更新:

    最终,为了让我的WebView 以全屏模式播放 Flash 视频,我必须在我的WebChromeClient 中实现onShowCustomView() 方法,其方式类似于在 Android 源代码中所做的浏览器。我用来激发灵感的那个方法的实现是在 BaseUI 类中:

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

    我不完全理解这里发生了什么。我还希望我能理解为什么 ICS 的开发人员决定要求实施这种方法。我希望我知道它的价值,或者这解决了什么问题。在过去的版本中,这种全屏模式“刚刚好”,现在需要大量挖掘。

    【讨论】:

      【解决方案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;
              }
          }
      }
      

      【讨论】:

      • 通过上面的代码,我终于把 Flash 播放视频全屏了。
      【解决方案3】:

      好的,所以我认为这是 android 4.0.2 / flash player 的问题,因为当 flash 进入全屏模式时,其他应用程序(如 browserdolphin mini)会崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多