2012-09-13 88 views
0

我的应用程序使用WebView来显示Flash视频内容。
一切似乎顺利 ,直到您尝试播放Android ICS设备上的全屏。
它可以在较低版本的设备上正常工作。
在ICS设备上,它抛出一个NullPointerException。 这里是我的代码:Android ICS Flash WebView全屏投掷NullPointerException

webView.getSettings().setJavaScriptEnabled(true); 
      webView.getSettings().setPluginsEnabled(true); 
      webView.getSettings().setLoadWithOverviewMode(true); 
      webView.getSettings().setUseWideViewPort(true); 
      webView.setVerticalScrollbarOverlay(true); 
      webView.setWebViewClient(new WebViewClient() { 
       private ProgressDialog pd; 

       @Override 
       public void onPageStarted(WebView view, String url, 
         Bitmap favicon) { 
        pd = new ProgressDialog(TrainingDetailActivity.this); 
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        pd.setMessage("Loading"); 
        pd.show(); 
        super.onPageStarted(view, url, favicon); 
       } 

       @Override 
       public void onPageFinished(WebView view, String url) { 
        this.dismissDialog(); 
        super.onPageFinished(view, url); 
       } 

       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, 
         String url) { 
        return false; 
       } 

       private void dismissDialog() { 
        if (pd != null) { 
         pd.dismiss(); 
         pd = null; 
        } 
       } 
      }); 
      webView.loadDataWithBaseURL(baseUrl, htmlstr, "text/html", "utf-8", null); 

一些挖后,我发现,在ICS的android.webkit.PluginFullScreenHolder show()方法被调用,并抛出 的NullExceptionPointer。问题在那里,而不是在我的代码上。 我尝试了一些工作,但都没有工作。
- 围绕工作:加入这一行:

webView.setWebChromeClient(new WebChromeClient()); 

这项工作围绕着NullPointerException异常不会发生,但没有声音的视频播放,并不会切换到 全屏模式。
我看了看周围的StackOverflow的解决方案,这似乎解决我的问题最接近的是这样的回答:
https://stackoverflow.com/a/9921073/1503155
但不幸的是回答者没有解释什么是在他的代码片段中的变量base我仍然坚持。
我的问题是,有没有办法解决这个错误。是的,怎么样?
在此先感谢。 Here is the stacktrace here

回答

4

我的老板让我允许与你分享。

在把这件东西拼凑在一起之前,我有很长一段时间的问题。

创建此为一类,并设置您的WebView的Chrome用户端:

WebView.setWebChromeClient(...); 

要这样:

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

+1问你的老板许可和试图帮助。不幸的是,我仍然得到相同的空例外。也许我做错了什么。我设置我的webview是这样的:WebView.setWebChromeClient(new FullscreenableChromeClient(this));这是使用该课程的正确方法吗?无论如何,我会尝试在我身边看看我做错了什么。真的很感谢你的帮助,因为我可以看到我仍然无法修复它。 –

+0

是的,那就是你如何使用这个类。什么是您收到错误的堆栈跟踪? – Knossos

+0

我在原帖中添加了stacktrace图片。 –

1

感谢楼上代码

主机的问题我遇到

在活动中,我喜欢那样

@Override 
public void onBackPressed() { 
    Log.e(TAG, "onBackPressed"); 

    if(mCustomView!=null){ 
     mFull.onHideCustomView(); 
    }else{ 
     super.onBackPressed(); 
    } 
} 
+0

感谢您加入!我记得遇到Back按钮的问题。 –