2015-11-10 2 views
2

Я разрабатываю приложение, используя ArcGIS Runtime SDK для Android. Я получаю доступ к мозаичным basemaps от arcgis.com, используя следующий код, который отлично работает.ArcGIS Android Offline Map Tiles - User Credentials

UserCredentials creds = new UserCredentials(); 
creds.setUserToken("token", "referer"); 
String mapUrlUsaTopo = "https://services.arcgisonline.com/arcgis/rest/services/USA_Topo_Maps/MapServer"; 
mBasemapLayer = new ArcGISTiledMapServiceLayer(mapUrlUsaTopo, creds); 

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

com.esri.core.io.EsriSecurityException: Message: Unable to generate token. Details: 'username' must be specified., 'password' must be specified.

Вот код загрузки:

String tileUrlUsaTopo = "https://tiledbasemaps.arcgis.com/arcgis/rest/services/USA_Topo_Maps/MapServer"; 
final ExportTileCacheTask exportTileCacheTask = new ExportTileCacheTask(tileUrlUsaTopo, creds); 

Является единственным опция жесткого кодирования имени пользователя и пароля?

ответ

0

Andrew из поддержки Esri был очень полезным. Чтобы выполнить аутентификацию приложения (без имени пользователя и пароля), используя ваш идентификатор приложения и секретный ключ, вам нужно что-то вроде кода ниже. Однако в android sdk есть ошибка (BUG-000092420), и приведенный ниже код не работает в настоящее время. Мне говорят, что исправление может вступить в окончательный выпуск Quartz.

private class AppLoginTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     Log.d("MyApp", "AppLoginTask"); 
     Portal p = new Portal("https://www.arcgis.com", null); 

     try { 
      p.doOAuthAppAuthenticate(APP_SECRET, APP_ID, new CallbackListener<Portal>() { 
       @Override 
       public void onCallback(Portal portal) { 
        Log.d("MyApp", "login callback"); 
        //mCreds = new UserCredentials(); 
        mCreds = portal.getCredentials(); 
        setMapDataMode(MapDataMode.ONLINE); 
       } 
       @Override 
       public void onError(Throwable throwable) { 
        Log.e("MyApp", "login error"); 
       } 

      }); 
     } catch (Exception e) { 
      Log.d("MyApp", "login exception"); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void results) { 
     Log.d("MyApp", "login post execute"); 
     //setMapDataMode(MapDataMode.ONLINE); 
    } 

}