【发布时间】:2018-10-17 02:50:39
【问题描述】:
我想在 Android 上部署一个 Web 应用程序,存储在 assets 目录中。由于我使用 Html5 游戏,我无法直接从文件协议加载该 HTML 文件。
myWebView.loadUrl("file:///android_asset/www/games/index.html");
因为它存在一些安全问题,例如“跨源请求仅支持协议方案:http、data、chrome、chrome-extension、https”
所以我已经使用NanoHTTPD 成功创建了一个 Web 服务器,这样我就可以在 http:// 协议中加载该资产 HTML 文件
myWebView.loadUrl("http://localhost:8080/games/index.html");
但是,问题是 file:///android_asset/ 不是一个普通的目录,我不知道有任何其他方法可以访问其中的文件。我无法在 Android 中将 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/ 内容。
或者如果你知道有什么其他方式可以通过http协议访问android_asset目录,请解释一下。
【问题讨论】:
标签: android android-webview cordova-plugins android-assets nanohttpd