Несколько дней бился в мою голову, пытаясь заставить работать листовку офлайн-карт .Я изменил функцию getTileUrl
в leaflet-offline.js
, чтобы она только возвращала плитки из базы данных, и исключил _getStorageKey()
.JavaScriptInterface
и getImage()
работают правильно и возвращают тип Bitmap, но автономные листы не обрабатываются.Одна вещь, которая мне не ясна, это Promises
, и getImage()
должен возвращать байт [] вместо Bitmap.У кого-нибудь есть рабочий пример листовки в автономном режиме, который я мог бы изучить?
//*** From leaflet-offline.js ***\\
getTileUrl: function (coords) {
var url = L.TileLayer.prototype.getTileUrl.call(this, coords);
var resultPromise = this._tilesDb.getItem(url).then(function (data) {
if (data && typeof data === 'object') {
return URL.createObjectURL(data);
}
}).catch(function (err) {
throw err;
});
return resultPromise;
},
//*** From leaflet.html ***\\\
var tilesDb = {
getItem: function (key) {
return new Promise(
function(resolve, reject) {
var bitmap = Android.getImage(key);
resolve(bitmap);
}
);
},
saveTiles: function (tileUrls) {
// return Promise.
},
clear: function () {
// return Promise.
}
};
//*** From WebAppInterface.java ***\\
@JavascriptInterface
public Bitmap getImage(String key) { return parentActivity.getImage(key); }
//*** From MainActivity.java ***\\
public Bitmap getImage(String key) {
String z, x, y;
String[] strArray = key.split("/");
if (settings.getString("OverlaymapSourceTitle", "") == "OpenStreetMap") {
z = strArray[3];
x = strArray[4];
y = strArray[5].split("\\.")[0];
} else {
z = strArray[9];
x = strArray[11];
y = strArray[10];
}
Cursor cursor;
cursor = db.rawQuery("SELECT _tile FROM Items WHERE _z=? AND _x=? AND _y=?", new String[]{z, x, y});
if (cursor.getCount() > 0) {
cursor.moveToFirst();
byte[] byteArray = cursor.getBlob(cursor.getColumnIndex("_tile"));
Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
cursor.close();
return bm;
}
return null;
}