0

私のアプリケーションは、WebView を使用してフラッシュ ビデオ コンテンツを表示します。
Android ICS デバイスで全画面表示を試みるまで、すべてがスムーズに進むようです。
下位バージョンのデバイスでは問題なく動作します。
ICS デバイスでは、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

ここにスタックトレースがあります

4

2 に答える 2

4

私の上司は、これをあなたと共有する許可を与えてくれました。

これをまとめる前に、私は長い間同じ問題を抱えていました。

これをクラスとして作成し、WebView のクロム クライアントを設定します。

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;
        }
    }
}
于 2012-09-27T14:49:31.180 に答える
1

2階のコードをありがとう

ホストの問題が発生しました。</p>

アクティビティでは、そのように解決しました。</p>

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

    if(mCustomView!=null){
        mFull.onHideCustomView();
    }else{
        super.onBackPressed();
    }
}
于 2013-10-22T13:04:02.517 に答える