Загрузка ресурсов в WebView из модуля динамических функций Android - PullRequest
0 голосов
/ 11 октября 2019

Этот вопрос касается загрузки содержимого HTML из папки ресурсов в компонент WebView внутри модуля динамических функций Android, когда приложение загружается из Google Play. Как ты можешь это сделать? Прямо сейчас я получаю сообщение об ошибке «файл не найден», когда мой код использует WebView.loadUrl.

Обратите внимание, что этот вопрос не о том, как загрузить контент HTML в WebView внутри основного приложения Android. модуль. Речь идет также не о том, чтобы заставить его запускаться локально в эмуляторе - загрузка содержимого 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 Ответ

1 голос
/ 19 октября 2019

После множества исследований я нашел это в Интернете:

https://chromium.googlesource.com/chromium/src.git/+/master/docs/android_dynamic_feature_modules.md

Ограничения У DFM есть следующие ограничения:

WebView: мы не делаемПоддержка DFM для WebView. Если ваша функция используется WebView, вы не можете поместить ее в DFM.

Поэтому вы не можете использовать WebView в модуле динамических функций.

...