我开始在Android上开发一个应用程序,所以我手头没有太多东西。到目前为止,我只有一个WebView。我在Android Studio中创建了这个项目,我的项目设置为Android InstantApp。我不确定为什么/如何,但我猜是我在创建项目时忽略了它的一个选项。

我从WebView得到一个错误说net:: err_cleartext_not_allowed。当我谷歌这个错误时,我看到当一个应用程序是一个InstantApp, WebViews只能加载HTTPS网站,而不能加载HTTP网站。

这个应用程序的目的是成为一个非常简单的Flash播放器,只有一个网站。这是为了更好地运行需要Flash的游戏。这个游戏在darkorbit.com上,是HTTPS协议。

MainActivity.java:

package com.tylerr147.darkorbit;

import android.content.ComponentName;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

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

        WebView wv = findViewById(R.id.webView1);
        wv.loadUrl("https://darkorbit.com/");
        wv.setWebViewClient(new CustomWebViewClient());
        WebSettings webSettings = wv.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setPluginState(WebSettings.PluginState.ON);

    }
}

和CustomWebViewClient.java

package com.tylerr147.darkorbit;

import android.webkit.WebView;
import android.webkit.WebViewClient;

public class CustomWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

我的问题: 我如何禁用我的应用程序作为一个InstantApp,或者我如何让这个WebView显示网站?

我觉得还有一些细节也很重要: 在应用程序中,它正在显示WebView,它还说“http://darkorbit.com/的网页”无法加载,因为: net:: ERR_CLEARTEXT_NOT_PERMITTED

注意它说的是“…网址是http://darkorbit.com/ ",而不是"…即使URL的字符串是硬编码的,并且显示为“https://darkorbit.com/”。此外,我正在运行Android 9的谷歌Pixel 2模拟器上测试该应用程序。

任何帮助都将不胜感激。谢谢你!


当前回答

解决方案:

在应用程序标签中添加以下行:

android:usesCleartextTraffic="true"

如下图所示:

<application
    ....
    android:usesCleartextTraffic="true"
    ....>

更新:如果你有网络安全配置,如:android:networkSecurityConfig="@xml/network_security_config"

不需要将明文流量设置为true,而是使用下面的代码:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        ....
        ....
    </domain-config>

    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

设置cleartexttrafficallowed为true

其他回答

解决方案:

在应用程序标签中添加以下行:

android:usesCleartextTraffic="true"

如下图所示:

<application
    ....
    android:usesCleartextTraffic="true"
    ....>

更新:如果你有网络安全配置,如:android:networkSecurityConfig="@xml/network_security_config"

不需要将明文流量设置为true,而是使用下面的代码:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        ....
        ....
    </domain-config>

    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

设置cleartexttrafficallowed为true

当你调用“https://darkorbit.com/”时,你的服务器认为它缺少了“www”,所以它将调用重定向到“http://www.darkorbit.com/”,然后再重定向到“https://www.darkorbit.com/”,你的WebView调用在第一次重定向时被阻止,因为它是一个“http”调用。 您可以调用“https://www.darkorbit.com/”,它将解决问题。