Android WebView Activity 启动然后在 5.1.1 上崩溃

Posted

技术标签:

【中文标题】Android WebView Activity 启动然后在 5.1.1 上崩溃【英文标题】:Android WebView Activity Starts Then Crashes On 5.1.1 【发布时间】:2017-12-13 13:53:10 【问题描述】:

好的,对你们来说这是一个非常奇怪的问题。我有一个非常简单的 android 应用程序,其中包含两个 webview 活动。他们都(显然)查看了托管在我的服务器上的 html 网页。这就是问题所在;该应用程序在我的 6.0.1 设备上运行得非常好,但是当我在我的 5.1.1 电视盒上运行它时,它正常启动,文本输入字段显示闪烁的指示器,因此我知道它已启动并正在运行。指示灯将闪烁 3 或 4 次,然后应用程序强制关闭。

清单.xml

package="myapp">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
<uses-feature android:name="android.hardware.screen.landscape" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.type.television" android:required="false" />
<uses-feature android:name="android.hardware.usb.host" android:required="false" />
<uses-feature android:name="android.hardware.wifi" android:required="false" />
<uses-feature android:name="android.software.leanback" android:required="false"/>
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@android:style/Theme.DeviceDefault"
    android:banner="@drawable/splash">

    <activity
        android:name="myapp.ShowWebView"
        android:finishOnTaskLaunch="true"
        android:label="@string/chat_name"
        android:theme="@android:style/Theme.DeviceDefault"
        android:excludeFromRecents="false">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
    </intent-filter>
</activity>
    <activity
        android:name="myapp.ShowWebViewTerms"
        android:finishOnTaskLaunch="true"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:excludeFromRecents="false" />

</application>

以及不断失败的活动:

public class ShowWebView extends Activity 

   private boolean haveNetworkConnection() 
          boolean haveConnectedWifi = false;
          boolean haveConnectedMobile = false;

          ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo[] netInfo = cm.getAllNetworkInfo();

      for (NetworkInfo ni : netInfo) 
         if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    
    return haveConnectedWifi || haveConnectedMobile;
    

//private Button button;
private WebView webView;
public void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    //This will not show title bar 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.show_web_view);

    //Get webview
    webView = (WebView) findViewById(R.id.webView1);
    if(haveNetworkConnection())
    startWebView("http://mywebsite/chat/index.php");
     else 
        webView.loadUrl("error.html");
       



private void startWebView(String url) 

    //Create new webview Client to show progress dialog
    //When opening a url or click on link

    webView.setWebViewClient(new WebViewClient() 


        //If you will not use this method url links are opeen in new brower not in webview
        public boolean Override(WebView view, String url) 
            view.loadUrl(url);
            return true;
        
        //If url has "tel:245678" , on clicking the number it will directly call to inbuilt calling feature of phone  
        public boolean shouldOverrideUrlLoading(WebView view ,String url)

                if(url.startsWith("tel:"))
                    Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                    startActivity(intent);
                 else 

                    view.loadUrl(url);

                
 return true;   

        //Show loader on url load


    );

     // javascript enabled on webview
    webView.getSettings().setJavaScriptEnabled(true);
    // Other webview options
    /*
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setBuiltInZoomControls(true);
            //Additional Webview Properties 
                webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            webView.getSettings().setDatabaseEnabled(true);
            webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
            webView.getSettings().setAppCacheEnabled(true);
            webView.getSettings().setLayoutAlgorithm(webView.getSettings().getLayoutAlgorithm().NORMAL);
            webView.getSettings().setLoadWithOverviewMode(true);
            webView.getSettings().setUseWideViewPort(false);
            webView.setSoundEffectsEnabled(true);
            webView.setHorizontalFadingEdgeEnabled(false);
            webView.setKeepScreenOn(true);
            webView.setScrollbarFadingEnabled(true);
            webView.setVerticalFadingEdgeEnabled(false);






    */

    /*
     String summary = "<html><body>You scored <b>192</b> points.</body></html>";
     webview.loadData(summary, "text/html", null);
     */

    //Load url in webview
    webView.loadUrl(url);






// Open previous opened link from history on webview when back button pressed

@Override
// Detect when the back button is pressed
public void onBackPressed() 
    if(webView.canGoBack()) 
        finish();
     else 
        // Let the system handle the back button
        super.onBackPressed();
    



不幸的是,因为我在电视盒上遇到了这个错误,所以我无法针对实际问题进行调试。这可能是一个很长的镜头,但我是 android 开发的新手,也许我会错过一些你不会错过的东西。非常感谢任何帮助或提示。提前致谢!

【问题讨论】:

“我无法调试实际问题”——如果您说您的电视盒不支持 USB 或网络上的adb,请用大锤砸盒子并获取一个更好的盒子。或者,集成崩溃日志解决方案(例如 ACRA)并将其用于调试和发布版本。 哈哈我同意你的观点,正如我所说,我是新手,终于让 WiFi ADB 工作并发现问题是我失踪了: @CommonsWare 【参考方案1】:

启用 WiFi ADB 后,我发现清单中缺少这个

 uses-permission android:name="android.permission.WAKE_LOCK"    

如果有人遇到相同或类似的问题,请在此处保留。

【讨论】:

以上是关于Android WebView Activity 启动然后在 5.1.1 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android webView 外部链接 -> 新建 Activity

Android Fragment使用 Activity, Fragment, WebView的状态保存和恢复

在 WebView (Android) 中保留数据

Android WebView Activity 启动然后在 5.1.1 上崩溃

Android WebView 在开发过程中都有哪些坑

Android WebView优化