Загрузить ресурсы в WebView из модуля динамических функций Android
Этот вопрос касается загрузки HTML-содержимого из папки ресурсов в компонент WebView внутри модуля динамических функций Android, когда приложение загружается из Google Play. Как ты можешь это сделать? Прямо сейчас я получаю сообщение об ошибке "файл не найден", когда мой код используетWebView.loadUrl
.
Обратите внимание, что этот вопрос не о том, как загрузить HTML-контент в WebView внутри основного модуля Android app. Речь также не идет о том, как заставить это работать локально на эмуляторе - загрузка HTML-содержимого отлично работает при загрузке на эмулятор в модуле динамических функций.
Мой проект имеет следующую структуру:
Top
- app (parent module)
| - src
| - ...
- module 1 (child module)
| - src
| - main
| - assets (html is under this folder)
| - java
| - org.example.fragment
| - WebFragment
Итак, модуль 1 - это функциональный модуль Android с Fragment
который загружает android.webkit.WebView
который должен загрузить активы. Но загрузка HTML-содержимого не работает, когда приложение загружается из Google Play.
Ниже приведен код фрагмента в модуле 1, который должен загружать HTML:
public class WebFragment extends Fragment {
protected static final String DEFAULT_LOCATION = "file:///android_asset/";
protected WebView gameView;
private static final String TAG = "MindGymWebFragment";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
SplitCompat.install(getContext());
View v = inflater.inflate(R.layout.fragment_web_mindgym, container, false);
try {
String gameToOpen = this.getArguments().getString("gameToOpen");
gameView = v.findViewById(R.id.memory_game_view);
setupSettings();
boolean isMemory = "Memory".equals(gameToOpen);
boolean isDestress = "DeStress".equals(gameToOpen);
if (isMemory) {
gameView.loadUrl(DEFAULT_LOCATION + "memory/memory.html");
} else if (isDestress) {
gameView.loadUrl(DEFAULT_LOCATION + "breathe/breathing.html");
}
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.unselectHomeTab();
if (isMemory || isDestress) {
mainActivity.setDailyOnABar(getString(org.brahmakumaris.beezone.R.string.mind_gym));
}
} catch (Exception e) {
Log.e(TAG, "Cannot initializa game", e);
}
return v;
}
protected void setupSettings() {
WebSettings settings = gameView.getSettings();
settings.setLoadWithOverviewMode(true);
settings.setUseWideViewPort(true);
settings.setAllowFileAccess(true);
settings.setAllowContentAccess(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBlockNetworkImage(false);
settings.setBlockNetworkLoads(false);
settings.setLoadsImagesAutomatically(true);
settings.setDomStorageEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setJavaScriptEnabled(true);
settings.setMediaPlaybackRequiresUserGesture(false);
}
@Override
public void onDestroy() {
gameView.destroy();
gameView = null;
super.onDestroy();
}
}
Итак: как вы можете загрузить HTML из модуля динамических функций, который обслуживается из Google Play?
Обновление 1: приведенный выше код будет работать, если ресурсы html скопированы в app/src/main/assets
папка - но это явно не то, что нам нужно. Веб-просмотр модуля 1 должен иметь доступ к папкам ресурсов модуля 1, когда модуль загружен из Google Play.
1 ответ
После множества исследований я нашел это в Интернете:
https://chromium.googlesource.com/chromium/src.git/+/master/docs/android_dynamic_feature_modules.md
Ограничения DFM имеют следующие ограничения:
WebView: мы не поддерживаем DFM для WebView. Если ваша функция используется WebView, вы не можете поместить ее в DFM.
Таким образом, вы не можете использовать WebView в модуле динамических функций.