我已将用
HTML
、CSS
和 JavaScript
编写的现有游戏转换为 Android 应用程序,方法是使用 WebView
(教程)将游戏包装在本机 Java 应用程序中。游戏使用 HTML5 Canvas
进行渲染。所有文件都存储在本地。
游戏包含多个JS文件,在物理设备上会导致CORS/同源错误,而在虚拟设备上运行则不会出现错误。显然解决方案是实施
WebViewAssetLoader
。
不幸的是,文档没有提供大量上下文,对于缺乏经验的 Android 开发人员来说,不清楚如何实际实现此功能。非常感谢任何帮助或建议。
只需将源代码复制粘贴到资产文件夹中,然后使用此代码在 Web 视图中加载 index.html 文件。
wv.setWebViewClient(new WebViewClient());
wv.getSettings().setLoadWithOverviewMode(true);
wv.getSettings().setUseWideViewPort(true);
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setPluginState(WebSettings.PluginState.ON);
wv.getSettings().setAllowFileAccess(true);
wv.getSettings().setAllowContentAccess(true);
wv.getSettings().setAllowFileAccessFromFileURLs(true);
wv.getSettings().setAllowUniversalAccessFromFileURLs(true);
wv.loadUrl("file:///android_asset/index.html");
您需要:
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.webkit.WebViewAssetLoader;
import androidx.webkit.WebViewClientCompat;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
和
final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
.addPathHandler(
"/assets/",
new WebViewAssetLoader.AssetsPathHandler(this)
)
.build();
WebView browser = (WebView) findViewById(R.id.w1);
browser.setWebViewClient(
new WebViewClientCompat() {
@Override
public WebResourceResponse shouldInterceptRequest(
WebView view,
WebResourceRequest request
) {
return assetLoader.shouldInterceptRequest(request.getUrl());
}
@Override
@SuppressWarnings("deprecation") // for API < 21
public WebResourceResponse shouldInterceptRequest(
WebView view,
String url
) {
return assetLoader.shouldInterceptRequest(Uri.parse(url));
}
}
);
// WebSettings webViewSettings = browser.getSettings();
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setDomStorageEnabled(true);
browser.loadUrl("https://appassets.androidplatform.net/assets/index.html");
浏览器是您的 Activity xml 中 Web 视图的名称/ID。
还记得以“assets”为基础构建文件,并将文件放入“main/android_asset”(是的,我知道)。