WebView - 无法添加窗口 - 令牌null不适用于应用程序

时间:2015-03-15 19:13:36

标签: java android android-intent android-webview android-service

我需要在WebView中运行Service。包含我从browser.xml获取的WebView的标记。这是我的代码片段:

public class OverlayWindow extends Service {
    private WindowManager windowManager;
    private View browserView;
    private WebView webView;
    private WindowManager.LayoutParams browserViewParams;

    @Override
    public void onCreate() {
        super.onCreate();

        browserView = layoutInflater.inflate(R.layout.browser, null);
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        webView = (WebView) browserView.findViewById(R.id.webView);

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    webView.loadUrl(url);
                return true;
            }
        }

        browserViewParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                PixelFormat.TRANSLUCENT);

        windowManager.addView(browserView, browserViewParams);
}

一切运行良好,但应用程序通常会因错误而崩溃:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
        at android.app.Dialog.show(Dialog.java:281)
        at android.app.AlertDialog$Builder.show(AlertDialog.java:951)

出现此错误的原因是Context,但在我的情况下,我没有将Context设置为WebView。

如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:2)

我可以提出另一个建议。而不是直接打开WebView,如何创建在其XML布局中具有Activity的{​​{1}},并使用<{1}}从WebView开始/ p>

Activity

这将永久消除Service的可能性。此外,Intent intent = new Intent(getBaseContext(), WebViewActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplication().startActivity(intent); 的网址可以作为BadTokenExceptionWebView的{​​{1}}的额外内容传递给Intent