ArcGIS Android离线地图平铺 - 用户凭据

时间:2015-11-10 14:47:46

标签: android arcgis

我正在使用适用于Android的ArcGIS Runtime SDK开发应用。我正在使用以下代码从arcgis.com访问平铺的底图,效果很好。

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:消息:无法生成令牌。详细信息:必须指定'username',必须指定'password'。

以下是下载代码:

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

唯一的选项是硬编码用户名和密码吗?

1 个答案:

答案 0 :(得分:0)

来自Esri支持的Andrew非常有帮助。做"申请"使用您的应用程序ID和密钥进行身份验证(没有用户名和密码),您需要类似下面的代码。但是,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);
    }

}