Android Yandex Mapkit search request by point or by name always return null values,why?

752 Views Asked by At

This is my example where I am tapping on the map to get the tapped point coordinates and to send a search request to know more details about that place, for example, city, street. But the response is always null values.

public class MainActivity extends AppCompatActivity implements CameraListener, InputListener, Session.SearchListener {

    private ActivityMainBinding binding;
    private SearchManager searchManager;
    private Session searchSession;
    private SearchOptions searchOptions;
    private MapObjectCollection mapObjectCollection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MapKitFactory.setApiKey("your api key");
        MapKitFactory.initialize(this);
        searchOptions = new SearchOptions();
        searchOptions.setSearchTypes(SearchType.GEO.value);
        searchOptions.setGeometry(true);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        binding.mapview.getMap().setNightModeEnabled((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES);

        searchManager = SearchFactory.getInstance().createSearchManager(SearchManagerType.COMBINED);
        binding.mapview.getMap().addCameraListener(this);
        binding.mapview.getMap().addInputListener(this);
        mapObjectCollection = binding.mapview.getMap().getMapObjects();

        binding.mapview.getMap().move(
                new CameraPosition(new Point(55.751574, 37.573856), 11.0f, 0.0f, 0.0f),
                new Animation(Animation.Type.SMOOTH, 0),
                null);
    }

    @Override
    protected void onStop() {
        super.onStop();
        binding.mapview.onStop();
        MapKitFactory.getInstance().onStop();
    }

    @Override
    protected void onStart() {
        super.onStart();
        binding.mapview.onStart();
        MapKitFactory.getInstance().onStart();
    }

    public void submitQueryByName(String query) {
        searchSession = searchManager.submit(
                query,
                Geometry.fromPoint(new Point(40.177200, 44.503490)),
                searchOptions,
                this);
    }

    public void submitQueryByPoint(Point point) {
        searchSession = searchManager.submit(
                point,
                11,
                searchOptions,
                this);
    }

    @Override
    public void onCameraPositionChanged(@NonNull Map map, @NonNull CameraPosition cameraPosition, @NonNull CameraUpdateReason cameraUpdateReason, boolean finished) {
        Log.e("onCameraPositionChanged"," cameraPosition: "+cameraPosition+" cameraUpdateReason: "+cameraUpdateReason+" finished: "+finished);
    }

    @Override
    public void onMapTap(@NonNull Map map, @NonNull Point point) {
        MapObjectCollection mapObjects = binding.mapview.getMap().getMapObjects();
        mapObjects.clear();

        PlacemarkMapObject placemarkMapObject = mapObjectCollection.addPlacemark(new Point(point.getLatitude(), point.getLongitude()),
                ImageProvider.fromResource(this, R.mipmap.marker_flag));

        submitQueryByPoint(point);
        Log.e("onMapTap", "point lat - lang: " + point.getLatitude() + " : " + point.getLongitude());
    }

    @Override
    public void onMapLongTap(@NonNull Map map, @NonNull Point point) {
        Log.e("onMapLongTap","onMapLongTap");
    }

    @Override
    public void onSearchResponse(@NonNull Response response) {
        try {
            Log.e("Search", "Response: " + response);
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onSearchError(@NonNull Error error) {
        String errorMessage = "unknown_error_message";
        if (error instanceof RemoteError) {
            errorMessage = "remote_error_message";
        } else if (error instanceof NetworkError) {
            errorMessage = "network_error_message";
        }
        Log.e("Response error", " error: " + errorMessage);
    }
}

In the onMapTap method, I get the tapped point coordinates and send a search request by point

@Override
    public void onMapTap(@NonNull Map map, @NonNull Point point) {
        MapObjectCollection mapObjects = binding.mapview.getMap().getMapObjects();
        mapObjects.clear();

        PlacemarkMapObject placemarkMapObject = mapObjectCollection.addPlacemark(new Point(point.getLatitude(), point.getLongitude()),
                ImageProvider.fromResource(this, R.mipmap.marker_flag));

        submitQueryByPoint(point);
        Log.e("onMapTap", "point lat - lang: " + point.getLatitude() + " : " + point.getLongitude());
    }

**Response is always null values. What I do wrong?

This is a GitHub whole project for this example https://github.com/davmehrabyan/YandexMapSearch **

1

There are 1 best solutions below

0
On

In the response field, when using debug mode, the null value is always displayed until you start trying to get them explicitly. If you run it with the code below in debug mode, you will see that the response will no longer be null.

loadAddressSession = searchManager.submit(new Point(lat, lon), 16, new SearchOptions(), this)

@Override
public void onSearchResponse(@NonNull Response response) {
    for (GeoObjectCollection.Item searchResult : response.getCollection().getChildren()) {
            final String name = searchResult.getObj().getName();
            final String desc = searchResult.getObj().getDescriptionText();
            final Point resultLocation = searchResult.getObj().getGeometry().get(0).getPoint();
            final ToponymObjectMetadata toponymObjectMetadata = searchResult.getObj().getMetadataContainer().getItem(ToponymObjectMetadata.class);
            final BusinessObjectMetadata businessObjectMetadata = searchResult.getObj().getMetadataContainer().getItem(BusinessObjectMetadata.class);
    }
}

And change

MapKitFactory.setApiKey("your api key");
MapKitFactory.initialize(this);

to

MapKitFactory.setApiKey("your api key");
MapKitFactory.initialize(this);
SearchFactory.initialize(this);