2016-09-30 4 views
0

Я работаю над 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 ...

+0

Несколько вопросов и предложений: Какую версию SDK Mapbox вы используете? Где DB_Handler получает данные? Если он использует базу данных Sqlite, вы не должны вызывать ее из потока пользовательского интерфейса, так как это будет связано с доступом к файлу. Я предлагаю вам зарегистрировать значение, возвращаемое для токена Mapbox.Перед созданием автономного региона и началом загрузки вы должны проверить, существует ли он в автономной базе данных. – Clyde

+0

Мы используем com.mapbox.mapboxsdk: mapbox-android-sdk: [email protected] DB_Handler пришел из нашей библиотеки и получил данные из SQLLite. Нет проблем с этим. Вызов SQL не находится внутри Async. Они делались раньше. Мы удаляем область в другой деятельности, поэтому здесь мы имеем только создание. На самом деле мы замечаем более странную проблему с lib, вероятно, из-за того, что Android полон асинхронный. Например, кажется, что вы можете инициализировать Lib и до того, как init закончен, вызовите функции. Который, конечно, не нравится ... Если я onStatusChanged, я много думаю, у меня много проблем. Еще расследование ... Спасибо. – Peter

ответ

0

Найденный. На самом деле есть небольшая ошибка в коде, который поможет мне понять: как это может код работать иногда, как я называю

OfflineManager offlineManager = OfflineManager.getInstance(this); 
    MapboxAccountManager.start(this,the_mapbox_token); 

так, как я называю инициализации после использования Lib? Фактически, все примеры в Mapbox производятся с одним действием, выполняющим все задания. Поэтому, когда у вас есть несколько операций с использованием Mapbox, вы быстро считаете, что вам нужно поставить MapboxAccountManager.start в каждом из них. Это неправильно. В этом случае (более одного действия) вы должны вызвать MapboxAccountManager.start на уровне приложения. Как что:

public class App_Start extends Application 
{ 
@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    String the_mapbox_token = "pk.eyJ1IjoiYW5....."; 
    MapboxAccountManager.start(this,the_mapbox_token); 
} 

public void customAppMethod() 
{ 
    // Custom application method 
} 

} 

и добавить этот класс на уровне приложений на ваш манифесте:

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="net.ansb_brasil.xxxx.App_Start"> 

Что касается того факта, вторая активности исполняющей два раза скачать, он пришел из фактически если (status.isComplete()) часть onStatusChanged() всегда вызывается два раза. Кажется, это ошибка в Lib. В некоторых примерах в Mapbox они используют логический флаг, чтобы избежать двойного вызова этого вызова в учетной записи. Поскольку моя первая активность загружала одну карту, а затем вызывала второе действие для второй карты, этот «двойной вызов» имел в результате два вызова для второго действия и так много проблем.

Надеюсь, что это позволит избежать головных болей другим

Смежные вопросы