ShouldOverrideUrlLoading на пользовательской Кордове CordovaWebViewClient больше не работает

У меня был пользовательский класс, чтобы переопределить метод shouldOverrideUrlLoading, предоставленный CordovaWebViewClient.

public class CordovaCustomWebClient extends CordovaWebViewClient { public CordovaCustomWebClient(CordovaInterface cordova, CordovaWebView view) { super(cordova, view); } @SuppressLint("DefaultLocale") @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { EventLogger.logMessage(getClass(), "--------------- shouldOverrideUrlLoading ---------------"); return super.shouldOverrideUrlLoading(view, url); } 

Он работал нормально, пока я не обновился до последней версии Кордовы (3.6.3). Теперь функция shouldOverrideUrlLoading больше не вызывается, но когда я отлаживаю код, я вижу ту же самую функцию, которая выполняется в библиотеке Cordova (класс CordovaWebViewClient).

Вот что я делаю, чтобы переопределить веб-клиента Кордовы:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_application); cordovaWebView = (CordovaWebView) this.findViewById(R.id.mainView); Config.init(this); Application application = null; Bundle bundle = getIntent().getExtras(); if (bundle != null) { application = (Application) bundle.get("key_application"); } // Local Url to load application String url = ""; if (application != null) { if (HubManagerHelper.getInstance().getApplicationHosted() == null) { MyApp app = (MyApp) getApplication(); app.registerDefaultHubApplication(); } url = String.format(WebServicesClient.URL_WEB_APPLICATION, HubManagerHelper.getInstance() .getApplicationHosted(), application.getPath()); } cordovaWebView.setWebViewClient(new CordovaCustomWebClient(this, cordovaWebView)); // Listener to Download Web File with Native Component - Download Manager cordovaWebView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { downloadAndOpenFile(WebApplicationActivity.this, url); } }); String ua = cordovaWebView.getSettings().getUserAgentString(); String appVersion = getAppVersion(); String newUA = ua.concat(" MyApp." + appVersion); cordovaWebView.getSettings().setUserAgentString(newUA); if (savedInstanceState == null) { cordovaWebView.loadUrl(url); } else { ((LinearLayout) findViewById(R.id.view_loading)).setVisibility(View.GONE); } 

Сегодня я столкнулся с такой же проблемой после обновления до 3.6.3. Он рассмотрел исходный код Кордовы, чтобы понять, почему это было нарушено. В какой-то момент был введен новый метод init , который берет кучу параметров, считываемых из вашего config.xml. Если этот метод не вызывается вашим кодом, тогда, когда URL-адрес загружен, он попадет в initIfNecessary , который, в свою очередь, переопределит любые настраиваемые клиенты, которые были установлены.

Из их кода:

 private void initIfNecessary() { if (pluginManager == null) { Log.w(TAG, "CordovaWebView.init() was not called. This will soon be required."); // Before the refactor to a two-phase init, the Context needed to implement CordovaInterface. CordovaInterface cdv = (CordovaInterface)getContext(); if (!Config.isInitialized()) { Config.init(cdv.getActivity()); } init(cdv, makeWebViewClient(cdv), makeWebChromeClient(cdv), Config.getPluginEntries(), Config.getWhitelist(), Config.getExternalWhitelist(), Config.getPreferences()); } } 

Вы можете видеть, что makeWebViewClient , даже если вы, возможно, уже установили свой собственный клиент.

Я решил это с помощью:

 ConfigXmlParser parser = new ConfigXmlParser(); parser.parse(activity); CordovaInterface cordova = (CordovaInterface) activity; init(cordova, new WFWebViewClient(cordova, this), makeWebChromeClient(cordova), parser.getPluginEntries(), parser.getInternalWhitelist(), parser.getExternalWhitelist(), parser.getPreferences()); 

И удалило устаревшее использование Config.init(activity); ,

Надеюсь, это избавит вас от времени, которое я потратил сегодня.