2

WebView 内で Flash を再生できることに依存するアプリを構築していますが、Flash ビデオが全画面表示されるまで、すべてが期待どおりに機能することがわかりました。フルスクリーンを要求すると、画面が黒くなり、音声が約 5 秒間続きます。

最初は画面が白くなっていることに気付きましたが、以下の記事の解決策を採用して、ゴールポストを移動しました. Android ICS 4.0 Flash WebView をフルスクリーン呼び出し hideAll メソッドに配置しますか?

final WebView mWebView = (WebView)findViewById(R.id.webview);
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setPluginState(WebSettings.PluginState.ON);
    webSettings.setJavaScriptEnabled(true);
    mWebView.requestFocusFromTouch();
    mWebView.setWebViewClient(new WebViewClient());

    mWebView.setWebChromeClient(new WebChromeClient(){
        public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback){
            super.onShowCustomView(view, callback);   
            if(Build.VERSION.SDK_INT >=14) {
                if (view instanceof FrameLayout) {                  
                    mWebView.addView(view, new FrameLayout.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    Gravity.CENTER));                   
                    mWebView.setVisibility(View.VISIBLE);
                }
            }
        }
    });

全画面フラッシュ ビデオが開始すると、logcat に次のように表示されます。

08-11 15:09:47.435: V/VideoSurfaceView(23871): surfaceCreated

08-11 15:09:47.435: V/VideoSurfaceView(23871): surfaceChanged フォーマット = 842094169、幅 = 480、高さ = 690

次の回答は、ブラウザからの BaseUI クラスに似た onShowCustomView の実装を参照しています。showCustomView と呼ばれる非常によく似たメソッドがあります。コードをハックして BaseUI クラスのコンテンツを追加しようとしましたが、驚くべきことにコードをコンパイルして実行することができましたが、盲目的な違いはありませんでした。

Android 4.0 でフルスクリーン モードに入ろうとすると、Flash Player がクラッシュする

アイデアと助けを事前にありがとう....

4

1 に答える 1

2

さらに掘り下げた後、私は自分の質問に答えました。それにより、次の一連の問題に移りました。これを別の質問として投稿します。

次のコードは、Flashが向きの変更を要求しない限り、webViewから全画面でFlashを表示します。また、「指定された子にはすでに親があります」というクラッシュのトラブルシューティング後にremoveAllViews()メソッドを追加する必要があったため、ソースwebViewが破損します。

また、オーバーライドされたWebChromeClientメソッドからのアクセスを許可するために、最終的にWebViewを実装すると、このWebViewにアクセスする必要のある他のメソッドが中断されます。

public void startWebView(String url){
   final WebView mWebView = (WebView)findViewById(R.id.webview);
   final Context ctx = this;
   WebSettings webSettings = mWebView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);

        mWebView.requestFocusFromTouch();
        mWebView.setWebViewClient(new WebViewClient());

        mWebView.setWebChromeClient(new WebChromeClient(){
            protected WebView tempView;
            public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback){
                super.onShowCustomView(view, callback);   
                if(Build.VERSION.SDK_INT >=14) {
                    if (view instanceof FrameLayout) {                  
                        mWebView.addView(view, new FrameLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        Gravity.CENTER));                   
                        mWebView.setVisibility(View.VISIBLE);
                    }
                }

                if (mCustomView != null) {
                    callback.onCustomViewHidden();
                    return;
                }

                mOriginalOrientation = activity.getRequestedOrientation();
                FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView();
                mWebView.setVisibility(View.INVISIBLE);
                mFullscreenContainer = new FullscreenHolder(ctx);
                mWebView.removeAllViews();
                mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
                decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);
                mCustomView = view;
                setFullscreen(true);

                mCustomViewCallback = callback;
                activity.setRequestedOrientation(requestedOrientation);

            }


            public void onHideCustomView() {
                if(debug==true)Log.d(name,"onHide start");
                mWebView.setVisibility(View.VISIBLE);


                if(debug==true)Log.d(name,"onHide ");
                if (mCustomView == null)
                    return;
                setFullscreen(false);
                FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView();
                decor.removeView(mFullscreenContainer);
                mFullscreenContainer = null;
                mCustomView = null;
                mCustomViewCallback.onCustomViewHidden();
                if(debug==true)Log.d(name,"onHide callback");
                // Show the content view.
                activity.setRequestedOrientation(mOriginalOrientation);
                if(debug==true)Log.d(name,"onHide set orientation");
                mWebView.loadUrl("http://crooksandliars.com/susie-madrak/scott-brown-cries-over-poor-people-ge");
                if(debug==true)Log.d(name,"onHide start webview");
            }



            public void setFullscreen(boolean enabled) {
                Window win = activity.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);
            }
        });

        mWebView.loadUrl(url);
}



   static class FullscreenHolder extends FrameLayout {

        public FullscreenHolder(Context ctx) {
            super(ctx);
            setBackgroundColor(00000);
        }

        @Override
        public boolean onTouchEvent(MotionEvent evt) {
            return true;
        }
    }
于 2012-08-11T18:20:01.023 に答える