Android Offline Tiles, User Credentials and Tokens

3340
5
11-05-2015 05:11 PM
BillMyers1
New Contributor

I'm developing an app using the ArcGIS Runtime SDK for Android.  I'm accessing tiled basemaps from arcgis.com using the following code which works fine.

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);

But... when I attempt to download the map tiles for offline use I get the following error: com.esri.core.io.EsriSecurityException: Message: Unable to generate token. Details: 'username' must be specified., 'password' must be specified.

Here's the download code:

String tileUrlUsaTopo = "https://tiledbasemaps.arcgis.com/arcgis/rest/services/USA_Topo_Maps/MapServer";

final ExportTileCacheTask exportTileCacheTask = new ExportTileCacheTask(tileUrlUsaTopo, creds);

Is the only option hard coding the username and password?

Tags (2)
0 Kudos
5 Replies
BillMyers1
New Contributor

It would be great if the Esri Android Dev team would respond.

0 Kudos
BillMyers1
New Contributor

Andrew from Esri support was very helpful.  To do "application" authentication (without a user name and password) using your app id and secret key you need something like the code below.  However, there is a bug (BUG-000092420) in the android sdk and code below does not work at the present time.  I'm being told that the fix may make in into the Quartz final release.

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);
   }

}

0 Kudos
BillMyers1
New Contributor

Does anyone know if this works now in version 100.0.0?

0 Kudos
AlexanderNohe1
Occasional Contributor III

Lite level licensing worked for me:

License your app—ArcGIS Runtime SDK for Android | ArcGIS for Developers 

Is there a specific level of licensing that you are looking to use?

0 Kudos
ClémentLaskar
New Contributor III

Hi, I have the same problem with Runtime 100.6 on Android. I didn't found any bug fix in 100.7 anouncement Announcing ArcGIS Runtime 100.7 . Was it fixed ? Thanks

0 Kudos