Я хотел бы развернуть веб-приложение на 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, объясните это.