JavaScript не працює в Android Webview?


81

Я намагаюся зробити версію для Android відносно простої програми для iOS, яка використовує веб-перегляд, деякі кнопки, а потім покладається на дзвінки JavaScript до CMS.

Але я застряг на досить ранньому етапі розробки: веб-перегляд не працює з javascript. Я прочитав багато публікацій про те, як увімкнути JS в веб-перегляді Android, але поки що мені не пощастило.

Нижче наведено деякі мої коди:

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)");
}

Що я тут роблю не так? URL-адреса чудово працює в моєму додатку iOS та браузері. Але не в моєму додатку!

Скажіть, будь ласка, це щось очевидне ...


29
Ну, чому хтось голосує за моє запитання? Я витратив багато часу на дослідження, але нічого не знайшов, тому я б сказав, що моє запитання є дуже слушним: /
Девід К.

1
я знайшов пост , що відповісти на ці питання [Android WebView геолокації] [1] [1]: stackoverflow.com/questions/5329662 / ...
yanddam

Початківці також можуть бачити tutorials.jenkov.com/android/… , є багато порад щодо WebView.
CoolMind

Відповіді:


128

Виправлено! Підбадьорений помилкою, я з’ясував, що мені потрібно встановити

setDomStorageEnabled(true)

для налаштувань веб-перегляду.

Дякуємо за допомогу Стефане :)


+1 Незважаючи на те, що я не отримував "помилку localStorage", увімкнення сховища Dom того, чого йому не вистачало для відображення сторінки.
momo

чому, що це конкретно робить?
Франсіско Корралес Моралес, 02

@ElijahSaounkine, я виправив вашу помилку. :)
CoolMind

7
mWebView.getSettings().setDomStorageEnabled(true);оскільки дурний я вперше спробувавmWebView.setDomStorageEnabled(true);
Джуліан Хонма

1
Ти врятував мій день.
Омар Хасан,

46

Якщо щось із WebView на Android не працює, я завжди намагаюся встановити ці шалені прапори, такі як,

    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");

Цікаво, чому вони не встановлені за замовчуванням, хто сьогодні очікує веб-сторінки без вмісту javascript, і яке використання, якщо ввімкнено javascript, коли DOM недоступний, якщо не вказано. Сподіваюся, хтось уже подав це як помилку або вдосконалення / запит функції, і мавпи працюють над цим.

а потім десь застарілі речі гниють, наприклад:

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

Все це для завантаження веб-сторінок всередині програми.

В iOS все так просто - 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)
}

Дякую, це дійсно допомагає.
ucMedia

Як Android може зробити так правильно і так неправильно, коли справа стосується розробки додатків.
Мо

У Xamarin Android така сама проблема, і рішення подібне. Дякую.
Luke Vo


6

Ви включили правильний дозвіл в Інтернеті в маніфесті? Інакше все виглядає нормально. Випадково, ви також тестували цей код на справжньому телефоні Android? І не тільки на емуляторі?

Ось хороший підручник з дещо іншого підходу. Можливо, ви захочете спробувати цей, щоб перевірити, чи він вам підходить.


1
Я щойно спробував його на своєму Samsung Galaxy SII, без удачі. Дозвіл додано в маніфесті як: <koristi-дозвіл android: name = "android.permission.INTERNET" /> Я дам посилання подивитися :)
Девід К

Я завантажив зразок проекту, який ви зв’язали, і який працює, але додавання моєї URL-адреси все ще не можна. Дивна річ у тому, що якщо я просто вводжу URL-адресу у власному браузері андроїдів (не через веб-перегляд у моєму додатку), це працює. Так дивно ..
David K

Що трапляється, коли ви використовуєте номер ip-адреси замість доменного імені? Крім того, чи можете ви спробувати ще раз із доменним іменем, але натомість цього разу натомість із звичайною сторінкою index.html? У мене закінчуються ідеї. Чи можете ви повідомити нам точну URL-адресу, яку ви використовуєте? Якщо ні, це нормально. Я просто думав запитати. Моїм наступним кроком було б спробувати перевірити коди відповідей заголовків http, які повертає ваш веб-додаток. У чомусь я не здивований, що веб-переглядач працює, а ваше завантаження URL-адреси - ні. Інтернет-браузери можуть бути неймовірно простими. Крім того, це може бути просто справа агента користувача.
Stephan Branczyk

Я оновив код оригінальною URL-адресою. Зміст датською мовою, але це не має значення. Я спробую перевірити http-коди, але не маю доступу до ip, оскільки сайт розміщується не мною, а другом, тож доведеться почекати.
David K

Код стану - 200, так що це не проблема. Але я виявив помилку в logcat: ПОМИЛКА / Веб-консоль (661): TypeError: Результат виразу 'localStorage' [null] не є об'єктом. за адресою slagterfriis.moski2.net/mobile/iphone/assets/script.js:16 Будь-яка ідея, що це означає?
David K

4

Додайте наступні рядки коду до вашого MainActivity.java

Це допомогло мені увімкнути js

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

не забувайте про цей дозвіл у файлі AndroidManifest.

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

4

Головним чином, цих трьох рядків буде достатньо, щоб Javascipt працював у webView ...

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

Якщо після цього він також не працює, додайте також рядок нижче.

webSettings.setDomStorageEnabled(true);

Насправді вам потрібні як setJavaScriptEnabled (), так і setWebChromeClient (новий WebChromeClient ()), щоб JavaScript працював. Якщо ви будете використовувати лише webSetting.setJavaScriptEnabled (true); тоді це не спрацює.


webSettings.setDomStorageEnabled (істина); працював у мене, дякую!
Dani Gee

2

Це відео ( http://youtu.be/uVqp1zcMfbE ) дало мені підказку, як це зробити. Головне - зберегти ваші файли htmlта jsфайли в assets/папці Android . Тоді ви зможете легко отримати до них доступ за допомогою:

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

2

Xamarin Android також має ту саму проблему, що WebView не виконує жодного Javascript. Дотримуйтесь відповіді @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";

Як не дивно, вони змінили всі методи встановлення на властивості, окрім SetSupportZoomі SupportZoomзалишаються як getter: /


1

Просто дозвольте своєму WebView запускати JS, просто так:

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

1

Якщо ви перебуваєте в Котліні, ви можете скористатися наступним методом для роботи JavaScript:

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

     settings.javaScriptEnabled = true
     settings.domStorageEnabled = true
 }

Також переконайтеся, що вся ваша папка знаходиться всередині папки Assets (сюди входить HTML, Javascript та інший необхідний файл)


0

Щоб увімкнути спливаючі вікна javascript у WebView, необхідно встановити webChromeClient та замінити методи openFileChooser .

    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;
        }
    });

І обробляйте onActivityResult, як показано нижче:

@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

Якщо нічого вище не допомогло додати затримку в прослуховувачі WebViewClient.onPageFinished

override fun onPageFinished(view: WebView?, url: String?) {
            Handler().postDelayed({
                //update your view with js here
                super.onPageFinished(view, url)
            }, 1000)
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.