2011-12-28 2 views
2

blip.tvや他のさまざまなFlash対応のWebサイトからビデオを再生するアンドロイドアプリを作成しました。私はWebviewを使ってビデオを表示します。ここに私のコードです:フルスクリーンモードに入るとFlash Playerがクラッシュする4.0 android 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){ 

    } 

問題はアンドロイド4(アイスクリームサンドイッチ)です。アプリをフルスクリーンモードにすると、アプリがクラッシュします。アプリはアンドロイド2.3または3.0でクラッシュすることはありません。これを修正するためのアイデアですか?

答えて

1

これはアンドロイド4.0.2 /フラッシュプレーヤーの問題だと思います。フルスクリーンモードにすると、browserdolphin miniなどのアプリがクラッシュするためです。

4

これは、フルスクリーンモードにしようとするとandroid.webkit.PluginFullScreenHoldershow()メソッドが呼び出されるため、ICSで発生します。このメソッドは、次の処理を行います。

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

あなたWebViewWebChromeClientを設定しない場合は、NPEを取得します。

これでクラッシュが修正されましたが、WebViewは表示されなくなり、フルスクリーンのビデオは表示されません。

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

***更新:最終的に

、私WebViewは、私は同様の方法で、私のWebChromeClientonShowCustomView()メソッドを実装しなければならなかった、フルスクリーンモードでフラッシュ動画を再生するために取得するために、 Androidブラウザのソースコードで何が行われたかについて説明します。私はインスピレーションのために使用されているメソッドの実装は、BaseUIクラスにいた:

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

私は完全にここで起こっている正確に理解していません。 ICSの開発者がこの方法を実装する必要があると決めた理由を理解してもらいたい。私はその価値を知りたかったのか、それともどのような問題が解決したのかと思います。これまでのバージョンでは、このフルスクリーンモードは「今すぐ動作しました」。今は多くの掘削が必要です。

+0

クール感謝を。 – Darcy

+2

あなたのソリューションを共有してください、ありがとう – user634545

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

上記のコードで、私はついにフラッシュビデオを全画面表示にしました。 –

関連する問題