我试图在基于Android WebView的应用程序中实现离线地图功能:
使用DownloadManager,我从我们的网络服务器下载一个sqlite数据库文件(像.mbtiles这样的结构),它包含地图图块图像的blob("离线地图")并通过它存储在android外部存储中
public void downloadMap() {
downloadManager = (DownloadManager) getActivity().getSystemService(Activity.DOWNLOAD_SERVICE);
DownloadManager.Request r = new DownloadManager.Request(Uri.parse("http://sry.youtoknow.idontwant/map.sqlite"));
r.setDestinationInExternalFilesDir(getContext(), "map", "map.sqlite");
downloadManager.enqueue(r);
}
Run Code Online (Sandbox Code Playgroud)
下载似乎工作得很好.
我注册了一个BroadcastReceiver接收DownloadManager.ACTION_DOWNLOAD_COMPLETE并存储"map.sqlite"的路径使用SharedPreferences.
要从JavaScript访问数据库以使用中的tile图像WebView,我通过检查customhttp:URL中的自定义虚构模式名称来拦截XHRequests:
webView.setWebViewClient(new WebViewClient() {
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (!url.startsWith("customhttp:")) {
return null;
} else {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
SQLiteDatabase db = SQLiteDatabase.openDatabase(preferences.getString("map_uri", Environment.getExternalStorageDirectory().getPath() + "berlin.sqlite"), null, SQLiteDatabase.OPEN_READONLY); …Run Code Online (Sandbox Code Playgroud)