2012-09-13 116 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按鈕的問題。 –