Android WebView应用在模拟器中崩溃:null Application Context?

4

我在Mac上使用AndroidStudio开发一个非常简单的Android应用程序,我已经创建了一个基于Nexus S的AVD。这个应用程序编译没有问题,模拟器启动后,日志记录器中出现错误并导致应用程序崩溃。在模拟器中,会显示一个错误对话框,其中包含消息“很抱歉,应用程序已停止”。

以下是logcat的输出(错误级别):

10-01 13:59:27.813  14114-14114/com.company.app E/SysUtils﹕ ApplicationContext is null in ApplicationStatus
10-01 13:59:27.832  14114-14114/com.company.app E/libEGL﹕ validate_display:255 error 3008 (EGL_BAD_DISPLAY)
10-01 13:59:27.832  14114-14114/com.company.app E/libEGL﹕ validate_display:255 error 3008 (EGL_BAD_DISPLAY)
10-01 13:59:27.832  14114-14114/com.company.app E/chromium﹕ [ERROR:gl_surface_egl.cc(327)] No suitable EGL configs found.
10-01 13:59:27.832  14114-14114/com.company.app E/chromium﹕ [ERROR:gl_surface_android.cc(23)] GLSurfaceEGL::InitializeOneOff failed.
10-01 13:59:27.832  14114-14114/com.company.app E/chromium﹕ [ERROR:browser_main_loop.cc(698)] GLSurface::InitializeOneOff failed
10-01 13:59:27.854  14114-14114/com.company.app E/DataReductionProxySettingListener﹕ No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp
10-01 13:59:28.530  14114-14165/com.company.app A/chromium﹕ [FATAL:gl_surface_android.cc(58)] Check failed: kGLImplementationNone != GetGLImplementation() (0 vs. 0)
10-01 13:59:28.530  14114-14165/com.company.app A/libc﹕ Fatal signal 6 (SIGABRT), code -6 in tid 14165 (GpuThread)

我假设与 ApplicationContext 相关的第一个错误是其他错误的根本原因,但我不确定。 我已尝试了大约 10 种不同的设置上下文的方法,但 ApplicationContext 错误仍然存在。
我的主要问题是:ApplicationContext 错误是否是崩溃的根本原因?如果不是,那么是什么?我应该尝试什么来解决它?
以下是完整的应用程序代码供参考:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.app" >
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <uses-permission android:name="android.permission.INTERNET" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MainActivity.java

package com.company.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;

public class MainActivity extends AppCompatActivity {

    private String appUrl = "http://company.com/mobile/index.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView myWebView = (WebView) findViewById(R.id.webView);
        myWebView.setWebViewClient(new MyWebViewClient());

        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        myWebView.loadUrl(appUrl);
    }
}

MyWebViewClient.java

package com.company.app;

import android.content.Intent;
import android.net.Uri;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("company.com")) {
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    }
}

2
<uses-permission android:name="android.permission.INTERNET" />标签移到<application>标签的外部并放置在其上方。 - ozbek
谢谢@ozbek。那是其中的一部分。 - byron
1个回答

4

2
谢谢。清单更改是解决方案的一部分,在修复后,应用程序实际上启动了,然后崩溃,而不是在启动之前崩溃。另一个部分是更新AVD以使用本机GPU。感谢您的帮助。你是对的...关于null ApplicationContext的logcat消息是无关紧要的。 - byron
2
另一部分是将AVD更新为使用本地GPU。谢谢!这对我很有帮助。 - Dmitry
<uses-permission> 我怎么会忘记它呢 - Prabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接