Интерфейс Javascript, ошибка "Uncaught Error: Ошибка вызова метода в NPObject"

В моем приложении для Android я использую WebAppInterface для перехода от Javascript к Java.

Мой файл.html включает в себя несколько JS, который выполняет "Android.canPlay();" в определенные времена.

В моем приложении функция canPlay () запускает прослушиватель переменных.

Когда срабатывает прослушиватель переменной, если выполняются условия, некоторые файлы переименовываются (временные файлы, которые были загружены с дополнительным расширением.tmp, включая файл.html (так что это файл.html.tmp), вместе с оригинальным файлом.html. Это))

После того, как происходит переименование, веб-представление перезагружается (я пробовал использовать как функцию, так и просто ".loadUrl()" - оба дают ошибки)

Когда приходит время перезагрузить HTML-файл в веб-представлении, я получаю сообщение об ошибке:

E / Web Console ﹕ Uncaught Error: Ошибка вызова метода в NPObject. в файле:////mnt/sdcard/Download/qwerty/playlists/29/2/index.html:206

Строка 206 - это вызов Android.canPlay ().

Вещи, на которые следует обратить внимание - если я не переименую файлы перед перезагрузкой веб-просмотра, а вместо этого переименую их из фоновой службы, которая запускается, у меня нет этой ошибки (хотя я получаю сообщение о запуске чего-либо в WebViewCoreThread)

Некоторый код:

WebAppInterface

public class WebAppInterface {
    final Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void canPlay()
    {
        mPlaylistReady.changeState(true);
    }
}

Переменный слушатель (запускается через класс слушателя) (некоторые биты кода удалены, например, общие настройки для расположения файлов)

@Override
public void onStateChange(boolean state) {

    if (state) { // true
            // this finds all the files and removes the .tmp extension
            fileRenamer.removeTmp(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/qwerty/playlists/"));

            // reloads the webview
            WebViewActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    webView.loadUrl("file:///" + htmlFile.getAbsolutePath());
                }
            });

        }
    }
}

Класс FileRenamer

public class FileRenamer {

    public void removeTmp(File directory)
    {
        File dir = directory;
        if(dir.isDirectory()) {
            for(File child : dir.listFiles()) {
                String name = child.getName();
                String ext = name.substring(name.lastIndexOf('.'));
                if(ext.equals(".tmp")) {
                    final int lastPeriodPos = name.lastIndexOf('.');
                    File renamed = new File(dir, name.substring(0, lastPeriodPos));
                    child.renameTo(renamed);
                }
            }
        }
    }

}

1 ответ

Эта ошибка вызывается JavaScript, потому что во время реализации Java canPlay() произошло исключение.

Попробуйте инкапсулировать метод WebAppInterface.canPlay() в предложении try-catch и зарегистрируйте исключение, чтобы выяснить, что могло произойти.

Кроме того, я пытаюсь найти способ сопоставления исключений в контексте JavaScript, но боюсь, что это невозможно.

Другие вопросы по тегам