Я работаю над MapBox off line. Код был в порядке, способный загружать карту, но после добавления некоторого фрагмента кода, который не имеет ничего общего с картой, загрузка перестает работать и дает ошибку HTTP401. Я заметил, что в зависимости от того, где вы вызываете MapboxAccountManager.start, иногда он терпит неудачу. Вот код:Mapbox Offlne (Android)
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
DB_Handler db_ansb = new DB_Handler(Init_Carte.this,null,null,1);
// Get data from DB, about the map
HashMap<String, String> data_mapbox = db_ansb.do_get_mapbox(0);
the_mapbox_token = data_mapbox.get("tmapbox_token");
the_mapbox_style = data_mapbox.get("tmapbox_style");
the_mapbox_zoom_min = Integer.parseInt(data_mapbox.get("tmapbox_zoom_min"));
the_mapbox_zoom_max = Integer.parseInt(data_mapbox.get("tmapbox_zoom_max"));
the_mapbox_inter = Double.parseDouble(data_mapbox.get("tmapbox_inter"));
OfflineManager offlineManager = OfflineManager.getInstance(this);
MapboxAccountManager.start(this,the_mapbox_token);
setContentView(R.layout.activity_init_carte);
// Menu with APP compat
// https://developer.android.com/training/appbar/setting-up.html
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
// Find our truck GPS position for road map
HashMap<String, String> my_truck = db_ansb.do_get_my_truck();
String str_truck_lagps = my_truck.get("frota_lagps");
String str_truck_logps = my_truck.get("frota_logps");
the_lagps_truck = Double.parseDouble(str_truck_lagps);
the_logps_truck = Double.parseDouble(str_truck_logps);
// Find accident location for road map
HashMap<String, String> my_inter = db_ansb.do_get_inter_resume();
String str_inter_lagps = my_inter.get("inter_lagps");
String str_inter_logps = my_inter.get("inter_logps");
the_lagps_inter = Double.parseDouble(str_inter_lagps);
the_logps_inter = Double.parseDouble(str_inter_logps);
// Compute area to get
HashMap<String, Double> data_gps_inter = db_ansb.do_get_bounds_inter(the_lagps_inter,the_logps_inter,the_mapbox_inter);
final double inter_lagps_ne = data_gps_inter.get("inter_max_lagps"); // Nord Est
final double inter_logps_ne = data_gps_inter.get("inter_max_logps");
final double inter_lagps_so = data_gps_inter.get("inter_min_lagps"); // Sud Ouest
final double inter_logps_so = data_gps_inter.get("inter_min_logps");
// Display what we're doing
tmp_id_msg = (TextView) findViewById(R.id.txt_action);
tmp_id_msg.setText(R.string.str_telechargement_carte);
// Create zone
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(inter_lagps_ne, inter_logps_ne)) // Northeast
.include(new LatLng(inter_lagps_so, inter_logps_so)) // Southwest
.build();
OfflineTilePyramidRegionDefinition definition = new OfflineTilePyramidRegionDefinition(
the_mapbox_style,
latLngBounds,
the_mapbox_zoom_min,
the_mapbox_zoom_max,
(Init_Carte.this).getResources().getDisplayMetrics().density);
byte[] metadata;
try
{
JSONObject jsonObject = new JSONObject();
jsonObject.put(JSON_FIELD_REGION_NAME, "Carte");
String json = jsonObject.toString();
metadata = json.getBytes(JSON_CHARSET);
} catch (Exception e)
{
Log.e("TAG", "Failed to encode metadata: " + e.getMessage());
metadata = null;
}
// Get data
offlineManager.createOfflineRegion(definition, metadata, new OfflineManager.CreateOfflineRegionCallback()
{
@Override
public void onCreate(OfflineRegion offlineRegion)
{
offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
// Monitor the download progress using setObserver
offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver()
{
@Override
public void onStatusChanged(OfflineRegionStatus status)
{
Log.i("DBUG","onStatusChanged");
// Calculate the download percentage and update the progress bar
double percentage = status.getRequiredResourceCount() >= 0 ?
(100.0 * status.getCompletedResourceCount()/status.getRequiredResourceCount()) :
0.0;
long long_pourcentage = Math.round(percentage);
String str_pourcentage = Long.toString(long_pourcentage)+" %";
// Display on screen
tmp_id_valeur = (TextView) findViewById(R.id.val_action);
tmp_id_valeur.setText(str_pourcentage);
Log.i("DBUG",str_pourcentage+"%");
if (status.isComplete())
{
// OK so now, ask the road
do_get_trajet();
}
}
@Override
public void onError(OfflineRegionError error)
{
// If an error occurs, print to logcat
Log.i("DBUG", "onError reason: " + error.getReason());
Log.e("DBUG", "onError message: " + error.getMessage());
}
@Override
public void mapboxTileCountLimitExceeded(long limit)
{
// Notify if offline region exceeds maximum tile count
Log.i("DBUG", "Mapbox tile count limit exceeded: " + limit);
}
});
}
@Override
public void onError(String error)
{
Log.e("TAG", "Error: " + error);
}
});
}
входит часть Асинхронной, получить 3 или 4 раза Log.i ("DBUG", str_pourcentage + "%"); со значением 0% затем получить я получаю:
I/System.out: [CDS] гй Тайм-аут: 10000 Д/NativeCrypto: = 0x619629c8 SSL sslWrite ЬиЙ = 0x41e60068 Len = 222 write_timeout_millis = 0 Д/NativeCrypto: = 0x619629c8 SSL sslRead ЬиЕ = 0x41e60068 Len = 8192, Timeo = 10000 I/DBUG: OnError причина: REASON_OTHER Е/DBUG: OnError сообщение: HTTP-код состояния 401 D/com.mapbox.mapboxsdk.http.HTTPRequest: [HTTP] Запрос с кодом ответа = 401: Неавторизованный
Я заметил такое же странное поведение на другой странице: в зависимости от того, что вы выполняете или нет, действие до этого после MapboxAccountManager.start (this, th e_mapbox_token); он работает или нет.
Обратите внимание, что токен верен.
Любая идея?
После изменения фишки в нашей БД, это было в порядке, но только в течение короткого времени: я был в состоянии загрузить 26% карту, а затем я снова сообщение HTTP 401 ...
Несколько вопросов и предложений: Какую версию SDK Mapbox вы используете? Где DB_Handler получает данные? Если он использует базу данных Sqlite, вы не должны вызывать ее из потока пользовательского интерфейса, так как это будет связано с доступом к файлу. Я предлагаю вам зарегистрировать значение, возвращаемое для токена Mapbox.Перед созданием автономного региона и началом загрузки вы должны проверить, существует ли он в автономной базе данных. – Clyde
Мы используем com.mapbox.mapboxsdk: mapbox-android-sdk: [email protected] DB_Handler пришел из нашей библиотеки и получил данные из SQLLite. Нет проблем с этим. Вызов SQL не находится внутри Async. Они делались раньше. Мы удаляем область в другой деятельности, поэтому здесь мы имеем только создание. На самом деле мы замечаем более странную проблему с lib, вероятно, из-за того, что Android полон асинхронный. Например, кажется, что вы можете инициализировать Lib и до того, как init закончен, вызовите функции. Который, конечно, не нравится ... Если я onStatusChanged, я много думаю, у меня много проблем. Еще расследование ... Спасибо. – Peter