JavaScript funktioniert nicht in Android Webview?


78

Ich versuche, eine Android-Version einer relativ einfachen iOS-App zu erstellen, die eine Webansicht und einige Schaltflächen verwendet und sich dann auf Javascript-Aufrufe an ein CMS stützt.

Aber ich stecke an einem ziemlich frühen Punkt der Entwicklung fest: Die Webansicht funktioniert nicht mit Javascript. Ich habe viele Beiträge darüber gelesen, wie JS in einer Android-Webansicht aktiviert werden kann, aber bisher kein Glück.

Unten ist ein Teil meines Codes:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient());
    mWebView.setWebViewClient(new HelloWebViewClient()
    {
        @Override  
        public void onPageFinished(WebView view, String url)  
        {  
            //Calling an init method that tells the website, we're ready 
            mWebView.loadUrl("javascript:m2Init()");
            page1(mWebView);
        }  
    });
  mWebView.loadUrl("http://my_url/mobile/iphone//app.php");  
}

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

}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public void page11(View view)
{
    mWebView.loadUrl("javascript:m2LoadPage(1)");
}

Was mache ich hier falsch? Die URL funktioniert in meiner iOS-App und in einem Browser einwandfrei. Aber nicht in meiner App!

Bitte sag mir, dass es etwas Offensichtliches ist ...


28
Ähm, warum stimmt jemand meine Frage ab? Ich habe viel Zeit mit Nachforschungen verbracht, aber nichts gefunden, daher würde ich sagen, dass meine Frage sehr gültig ist: /
David K

1
Ich habe einen Beitrag gefunden, der diese Fragen beantwortet [Android Webview Geolocation] [1] [1]: stackoverflow.com/questions/5329662/…
yanddam

Anfänger können auch tutorials.jenkov.com/android/… sehen , es gibt viele Tipps zu WebView.
CoolMind

Antworten:


125

FEST! Angespornt durch den Fehler fand ich heraus, dass ich einstellen musste

setDomStorageEnabled(true)

für die Webview-Einstellungen.

Danke für deine Hilfe Stephan :)


+1 Obwohl ich den "localStorage-Fehler" nicht erhalten habe, wurde der Dom-Speicher aktiviert, was fehlte, um die Seite anzuzeigen.
Momo

warum, was macht es konkret?
Francisco Corrales Morales

@ElijahSaounkine, ich habe deinen Fehler behoben. :)
CoolMind

6
mWebView.getSettings().setDomStorageEnabled(true);da dumm habe ich es zuerst versuchtmWebView.setDomStorageEnabled(true);
Julian Honma

1
Du hast meinen Tag gerettet.
Omar Hassan

44

Falls etwas mit WebView unter Android nicht funktioniert, versuche ich immer sicherzustellen, dass ich diese verrückten Flags setze, wie z.

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDisplayZoomControls(false);
    webSettings.setSupportZoom(true);
    webSettings.setDefaultTextEncodingName("utf-8");

Ich frage mich, warum diese nicht standardmäßig festgelegt sind, die heutzutage Webseiten ohne Javascript-Inhalt erwarten würden, und was die Verwendung von Javascript bedeutet, wenn DOM nicht verfügbar ist, sofern nicht anders angegeben. Hoffe, jemand hat dies bereits als Fehler oder Verbesserungs- / Feature-Anfrage eingereicht und die Affen arbeiten daran.

und dann verrottet irgendwo veraltetes Zeug wie dieses:

webView.getSettings().setPluginState(PluginState.ON);

All dies zum Laden von Webseiten in die App.

Unter iOS ist alles so einfach - Swift 3.0

private func openURLWithInAppBrowser(urlString:String) {
    guard let url = URL(string:urlString) else {
        return
    }
    let sfSafari = SFSafariViewController(url:url)
    present(sfSafari, animated: true, completion: nil)
}

Danke, es hilft wirklich.
ucMedia

Wie kann Android die Dinge so richtig und so falsch machen, wenn es um die App-Entwicklung geht?
Moe

Xamarin Android hat das gleiche Problem und die Lösung ist ähnlich. Vielen Dank.
Luke Vo

7

Laden von Javascript in der Webansicht

webView.getSettings().setDomStorageEnabled(true);

6

Haben Sie die richtige Internetberechtigung im Manifest aktiviert? Ansonsten sieht alles gut aus. Haben Sie diesen Code zufällig auch auf einem tatsächlichen Android-Handy getestet? Und das nicht nur auf dem Emulator?

Hier ist ein gutes Tutorial zu einem etwas anderen Ansatz. Vielleicht möchten Sie es versuchen, um zu sehen, ob es für Sie funktioniert.


1
Ich habe es gerade auf meinem Samsung Galaxy SII ausprobiert, ohne Glück. Die Berechtigung wird im Manifest wie folgt hinzugefügt: <Verwendungsberechtigung android: name = "android.permission.INTERNET" /> Ich werde dem Link einen Blick geben :)
David K

Ich habe das Beispiel des von Ihnen verlinkten Projekts heruntergeladen, das funktioniert, aber das Hinzufügen meiner URL ist immer noch ein Kinderspiel. Das Seltsame ist, dass es funktioniert, wenn ich die URL einfach in den eigenen Browser von androids eingebe (nicht über die Webansicht in meiner App). So seltsam ..
David K

Was passiert, wenn Sie die IP-Adressnummer anstelle des Domainnamens verwenden? Können Sie es auch erneut mit dem Domainnamen versuchen, diesmal jedoch mit einer einfachen index.html-Seite? Mir gehen die Ideen aus. Können Sie uns die genaue URL mitteilen, die Sie verwenden? Wenn nicht, ist das in Ordnung. Ich dachte nur, ich würde fragen. Mein nächster Schritt wäre, die Antwortcodes der http-Header zu überprüfen, die Ihre Web-App zurückgibt. In gewisser Weise wundert es mich nicht, dass der Aktienbrowser funktioniert und das Laden Ihrer URL nicht. Internetbrowser können unglaublich verzeihend sein. Es könnte auch nur eine User-Agent-Sache sein.
Stephan Branczyk

Ich habe den Code mit der ursprünglichen URL aktualisiert. Der Inhalt ist auf Dänisch, aber das sollte keine Rolle spielen. Ich werde versuchen, http-Codes zu überprüfen, habe aber keinen Zugriff auf die IP erhalten, da die Site nicht von mir, sondern von einem Freund gehostet wird, sodass ich warten muss.
David K

Der Statuscode ist 200, das ist also nicht das Problem. In logcat wurde jedoch ein Fehler festgestellt: ERROR / Web Console (661): TypeError: Ergebnis des Ausdrucks 'localStorage' [null] ist kein Objekt. at slagterfriis.moski2.net/mobile/iphone/assets/script.js:16 Irgendeine Idee, was das bedeutet?
David K

3

Fügen Sie die folgenden Codezeilen in Ihre Datei MainActivity.java ein

Es hat mir geholfen, js zu aktivieren

  webSetting.setJavaScriptEnabled(true);
  webView.setWebChromeClient(new WebChromeClient());
  webView.setWebViewClient(new WebViewClient());

Vergessen Sie diese Berechtigung in der AndroidManifest-Datei nicht.

<uses-permission Android:name="Android.permission.INTERNET" />

2

Dieses Video ( http://youtu.be/uVqp1zcMfbE ) gab mir den Hinweis, damit es funktioniert. Der Schlüssel ist, Ihre htmlund jsDateien im Android- assets/Ordner zu speichern . Dann können Sie einfach darauf zugreifen über:

webView.loadUrl("file:///android_asset/your_page.html");

6
Vermögenswert nicht Vermögen
Hamid

2

Hauptsächlich reichen diese drei Zeilen aus, damit Javascipt in webView funktioniert ...

webSetting.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());

Wenn es danach auch nicht funktioniert, fügen Sie auch die folgende Zeile hinzu.

webSettings.setDomStorageEnabled(true);

Tatsächlich benötigen Sie sowohl setJavaScriptEnabled () als auch setWebChromeClient (neuer WebChromeClient ()), damit JavaScript funktioniert. Wenn Sie nur webSetting.setJavaScriptEnabled (true) verwenden; dann wird es nicht funktionieren.


webSettings.setDomStorageEnabled (true); hat für mich gearbeitet, danke!
Dani Gee

1

Wenn Sie sich in Kotlin befinden , können Sie die folgende Methode verwenden, um das JavaScript zum Laufen zu bringen:

webView.apply {
     loadUrl(
         "file:///android_asset/frm/my_html_landing_page_here.html"
     )

     settings.javaScriptEnabled = true
     settings.domStorageEnabled = true
 }

Stellen Sie außerdem sicher, dass sich Ihr gesamter Ordner im Ordner "Assets" befindet (einschließlich HTML, Javascript und anderer erforderlicher Dateien).


1

Xamarin Android hat auch das gleiche Problem, dass WebView kein Javascript ausführt. Folgen Sie der Antwort von @computingfreak:

        this.SetContentView(Resource.Layout.activity_main);

        var webView = this.FindViewById<WebView>(Resource.Id.webView);

        var webSettings = webView.Settings;
        webSettings.JavaScriptEnabled = true;
        webSettings.DomStorageEnabled = true;
        webSettings.LoadWithOverviewMode = true;
        webSettings.UseWideViewPort = true;
        webSettings.BuiltInZoomControls = true;
        webSettings.DisplayZoomControls = false;
        webSettings.SetSupportZoom(true);
        webSettings.DefaultTextEncodingName = "utf-8";

Seltsamerweise haben sie alle Setter-Methoden in Eigenschaften geändert, außer SetSupportZoomund SupportZoombleiben als Getter: /


0

Erlauben Sie Ihrem WebView einfach, JS auszuführen, ganz einfach:

WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);

0

Um Javascript-Popups in WebView zu aktivieren, müssen Sie webChromeClient festlegen und openFileChooser- Methoden überschreiben .

    mWebview.setWebChromeClient(new WebChromeClient(){
        // For Android 4.1+
        @SuppressWarnings("unused")
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            mUploadMessage = uploadMsg;

            Intent i = new Intent(Intent.ACTION_GET_CONTENT);

            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType(acceptType);

            startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
        }

        // For Android 5.0+
        @SuppressLint("NewApi")
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            if (mUploadMessageArr != null) {
                mUploadMessageArr.onReceiveValue(null);
                mUploadMessageArr = null;
            }

            mUploadMessageArr = filePathCallback;

            Intent intent = fileChooserParams.createIntent();

            try {
                startActivityForResult(intent, 101);
            } catch (ActivityNotFoundException e) {
                mUploadMessageArr = null;

                Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();

                return false;
            }

            return true;
        }
    });

Behandeln Sie das onActivityResult wie folgt:

@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 100) {
        if (mUploadMessage == null) return;
        Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }

    else if (requestCode == 101) {
        if (mUploadMessageArr == null) return;
        mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
        mUploadMessageArr = null;
    }

}

0

Wenn nichts weiter oben geholfen hat, versuchen Sie, eine Verzögerung im WebViewClient.onPageFinished-Listener hinzuzufügen

override fun onPageFinished(view: WebView?, url: String?) {
            Handler().postDelayed({
                //update your view with js here
                super.onPageFinished(view, url)
            }, 1000)
        }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.