Веб-просмотр Android для доступа к каталогу android_asset по протоколу http - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы развернуть веб-приложение на Android, которое хранится в каталоге активов. Поскольку я использую Html5-игры, я не могу загрузить эти HTML-файлы напрямую из файлового протокола.

myWebView.loadUrl("file:///android_asset/www/games/index.html");

из-за проблем с безопасностью, таких как «Запросы перекрестного происхождения поддерживаются только для схем протоколов: http, data, chrome, chrome-extension, https»

Итак, я успешно создал веб-сервер, используя NanoHTTPD , чтобы я мог загрузить этот HTML-файл ресурсов в http: // protocol

myWebView.loadUrl("http://localhost:8080/games/index.html");

но проблема в том, что файл: /// android_asset / не является обычным каталогом, и я не знаю другого способа доступа к файлам внутри него. Я не могу установить корневой веб-файл как файл: /// android_asset / в Android.

Так что мне нужно знать, как установить webroot как файл: /// android_asset в ответе nanohttpd

mainactivity.java:

import android.content.res.AssetManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import fi.iki.elonen.NanoHTTPD;

public class MainActivity extends AppCompatActivity {

    private static boolean isStarted = false;
    private AndroidWebServer androidWebServer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!isStarted && startAndroidWebServer()) {
            isStarted = true;
            WebView simpleWebView=(WebView) findViewById(R.id.webview);
            simpleWebView.getSettings().setJavaScriptEnabled(true);
            simpleWebView.loadUrl("http://localhost:8080/games/index.html");
        }
    }

    private boolean startAndroidWebServer() {
        if (!isStarted) {
            try {
                int port = 8080;
                androidWebServer = new AndroidWebServer(port);
                androidWebServer.start();
                return true;
            }
            catch (Exception e) {
                Log.w("Httpd", "The server could not start."+e);
                e.printStackTrace();
            }
        }
        return false;
    }

    private boolean stopAndroidWebServer() {
        if (isStarted && androidWebServer != null) {
            androidWebServer.stop();
            return true;
        }
        return false;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopAndroidWebServer();
        isStarted = false;
    }

    private class AndroidWebServer extends NanoHTTPD {

        public AndroidWebServer(int port) {
            super(port);
        }

        @Override
        public Response serve(String uri, Method method,
                              Map<String, String> header, Map<String, String> parameters,
                              Map<String, String> files) {

            AssetManager am = getAssets();

            //  set web root as file:///android_asset/

            return newFixedLengthResponse(android_asset_directory_list);
        }
    }
}

Эта идея пришла от cordova-httpd , который является плагином Cordova, использующим Nanohttpd. Этот плагин использует веб-представление Cordova для доступа к ресурсам / www / content по протоколу HTTP.

Или, если вам известен какой-либо другой способ доступа к каталогу android_asset в протоколе http, объясните это.

1 Ответ

0 голосов
/ 07 мая 2018

Почему бы не прочитать файл ресурсов с помощью IOUtils:

/* code in Kotlin, but you get the meaning anyway */
val htmlContent = IOUtils.toString(assets.open("xml2json.txt")))
webView.loadData(htmlContent, "text/html", baseUrl)

ссылка: https://mvnrepository.com/artifact/commons-io/commons-io/2.5

также: 1. с недавней библиотекой поддержки Android больше не нужно приводить Java-метод findViewById (id), если вы не делаете это в Kotlin:

val webView = findViewById<WebView>(R.id.webView)
...