ArcGis: Esri Map "Недопустимый токен, используемый для доступа к безопасному сервису"

Я новичок в картах arcgis и esri, пытаюсь проложить маршрут между двумя точками, вот мой код:

map.setOnLongPressListener(new OnLongPressListener() {

        private static final long serialVersionUID = 1L;

        public boolean onLongPress(final float x, final float y) {

            grahpicslayer.removeAll();

            final Point loc = map.toMapPoint(x, y);


            grahpicslayer.addGraphic(new Graphic(loc, new SimpleMarkerSymbol(Color.RED, 20, SimpleMarkerSymbol.STYLE.CIRCLE)));

            //Display the red color diamond graphics
            map.addLayer(grahpicslayer);

            //zoom the map to the location
            map.zoomToResolution(loc, 20.0);


            new Thread(new Runnable() {
                @Override
                public void run() {


                    // new code
                    try {

                        String CLIENT_SECRET = "";
                        String CLIENT_ID = "";


                        //Prepare user credentials
                        UserCredentials userCredentials = new UserCredentials();
                        userCredentials.setAuthenticationType(UserCredentials.AuthenticationType.TOKEN);
                        userCredentials.setSSLRequired(false);
                        userCredentials.setUserToken(CLIENT_ID, CLIENT_SECRET);



            /*initialize RouteTask*/
                        String routeTaskURL = "https://route.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World";
                        RouteTask rt = RouteTask.createOnlineRouteTask(routeTaskURL, userCredentials);
                        RouteParameters rp = rt.retrieveDefaultRouteTaskParameters();
                        NAFeaturesAsFeature rfaf = new NAFeaturesAsFeature();

                        // Convert point to EGS (decimal degrees)
                        Point p = (Point) GeometryEngine.project(loc, wm,
                                egs);

                        //mlocation is your latitude and longitude point provided by GPS location in decimal degrees
                        StopGraphic point1 = new StopGraphic(mLocation);
                        StopGraphic point2 = new StopGraphic(p);

                        String message = "point 1 == " + ((point1 == null) ? "null" : point1.getName()) + "point 2 == " + ((point2 == null) ? "null" : point2.getName());

                        Message msg = Message.obtain(); // Creates an new Message instance
                        msg.obj = message; // Put the string into Message, into "obj" field.
                        msg.setTarget(h); // Set the Handler
                        msg.sendToTarget(); //Send the message


                        rfaf.setFeatures(new Graphic[]{point1, point2});

                        rfaf.setCompressedRequest(true);
                        rp.setStops(rfaf);
                        rp.setOutSpatialReference(wm);

                        RouteResult mresults = rt.solve(rp);

                    } catch (Exception e) {

                        String message = "ex : " + e.toString();

                        Message msg = Message.obtain(); // Creates an new Message instance
                        msg.obj = message; // Put the string into Message, into "obj" field.
                        msg.setTarget(h); // Set the Handler
                        msg.sendToTarget(); //Send the message
                    }
                }
            }).start();
            return true;
        }

    });

Код для получения текущего местоположения на основе слушателя изменения местоположения

/**
     * If location changes, update our current location. If being found for
     * the first time, zoom to our current position with a resolution of 20
     */
    public void onLocationChanged(Location loc) {
        if (loc == null)
            return;
        boolean zoomToMe = (mLocation == null) ? true : false;
        mLocation = new Point(loc.getLongitude(), loc.getLatitude());
        if (zoomToMe) {
            Point p = (Point) GeometryEngine.project(mLocation, egs, wm);
            map.zoomToResolution(p, 20.0);
        }
    }

После запуска этого кода я сталкиваюсь с этой ошибкой:

com.esri.core.io.EsriSecurityException: неверный токен, используемый для доступа к защищенному сервису - https://route.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World

1 ответ

Вы пытаетесь установить значение токена в своем коде, но значение не присваивается, также имя переменных (CLIENT_SECRET и CLIENT_ID) подразумевает вход в приложение с использованием OAuth2.

У вас есть 3 варианта доступа к службе маршрутизации: логин пользователя OAuth2, логин приложения OAuth2 или логин пользователя на основе токена. Предпочтительным методом является вход пользователя OAuth2, так что пользователь, который входит в систему, будет использовать свою учетную запись с именем ArcGIS Online, и все необходимые кредиты будут поступать из его подписки. На портале для разработчиков приведен пример кода для входа пользователя OAuth2.

Если вы по-прежнему хотите использовать логин на основе токена, вам необходимо установить имя пользователя и пароль для UserCredential, чтобы токен мог быть сгенерирован или использовать метод, который вы уже вызываете, но передать допустимую строку токена.

Я бы порекомендовал прочитать документацию по аутентификации на портале для разработчиков, если вы еще этого не сделали, поскольку в ней дано подробное описание каждой опции.

Другие вопросы по тегам