我想在Android上部署一个存储在assets目录中的Web应用程序。由于我使用Html5游戏,因此无法直接从文件协议加载HTML文件。
myWebView.loadUrl("file:///android_asset/www/games/index.html");
因为它存在一些安全问题,例如“仅支持协议方案的交叉源请求:http,数据,chrome,chrome-extension,https”
所以我使用NanoHTTPD成功创建了一个Web服务器,以便我可以在http:// protocol
中加载该资产HTML文件myWebView.loadUrl("http://localhost:8080/games/index.html");
但是,问题是file:/// android_asset /不是普通目录,我不知道任何其他方式来访问其中的文件。我无法在Web中将web root设置为file:/// android_asset /。
所以我需要知道如何在nanohttpd响应中将webroot设置为file:/// android_asset
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,它是使用Nanohttpd的Cordova插件。此插件使用Cordova webview通过HTTP协议访问assets / www / content。
或者如果你知道在http协议中访问android_asset目录的任何其他方法,请解释它。
答案 0 :(得分:0)
为什么不使用IOUtils读取资产文件:
val webView = findViewById<WebView>(R.id.webView)
REF: https://mvnrepository.com/artifact/commons-io/commons-io/2.5
也: 1.使用最近的android支持lib,不再需要强制转换findViewById(id)Java方法,除非你在Kotlin中这样做:
{{1}}