Search
Search
The SearchManager enables developers to search for locations, addresses, and points of interest (POIs). It supports free-text search, category-based filtering, and geographic filtering to help users find destinations.
Overview
SearchManager provides functionality for:
- Free-text search for addresses and POIs
- Category-based POI search (restaurants, gas stations, etc.)
- Brand name filtering
- Geographic filtering (around position, along route)
- Result type filtering
- Paginated results
Basic text search
Perform a simple search with a query string:
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.Coordinate3import com.tomtom.automotive.integration.client.api.model.search.SearchRequest4import com.tomtom.automotive.integration.client.api.model.search.SearchResult5import com.tomtom.automotive.integration.client.api.model.search.filters.GeoFilter6import com.tomtom.automotive.integration.client.api.search.SearchCallback7import com.tomtom.automotive.integration.client.api.search.SearchFailure8import com.tomtom.automotive.integration.client.api.search.SearchManager9import com.tomtom.automotive.integration.client.api.search.SearchParameters10import com.tomtom.automotive.integration.client.api.search.SearchResponse11import com.tomtom.automotive.integration.client.common.Callback12import com.tomtom.automotive.integration.client.common.Result13import com.tomtom.automotive.integration.client.common.SdkReleasable1415private val TAG = "Search"16private var searchReleasable: SdkReleasable? = null1718fun search(searchManager: SearchManager, query: String, currentPosition: Coordinate) {19 val geoFilter = GeoFilter.ByPositionBias(coordinate = currentPosition)2021 val searchRequest = SearchRequest(22 query = query,23 resultLimit = 10,24 geoFilter = geoFilter,25 filters = emptySet(),26 pageSize = 527 )2829 searchReleasable = searchManager.search(30 SearchParameters(searchRequest),31 object : SearchCallback {32 override fun onResult(response: Result<SearchResponse, SearchFailure>) {33 when (response) {34 is Result.Success -> {35 val results = response.value.results36 Log.d(TAG, "Found ${results.size} results")3738 results.forEach { result ->39 logSearchResult(result)40 }41 }42 is Result.Failure -> {43 Log.e(TAG, "Search failed: ${response.reason}")44 }45 }46 }4748 override fun onFunctionalityUnavailable(reason: Callback.Reason) {49 Log.e(TAG, "Search unavailable: ${reason.devMessage}")50 }51 }52 )53}5455private fun logSearchResult(result: SearchResult) {56 val coordinate = result.data?.coordinate57 when (result) {58 is SearchResult.Poi -> Log.d(TAG, "POI: ${result.poiName} at $coordinate")59 is SearchResult.Street -> Log.d(TAG, "Street: ${result.address.formattedAddress} at $coordinate")60 is SearchResult.Area -> Log.d(TAG, "Area at $coordinate")61 else -> Log.d(TAG, "Result at $coordinate")62 }63}6465fun cancelSearch() {66 searchReleasable?.release()67 searchReleasable = null68}
Search with location context
Provide current position for better, location-relevant results:
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.Coordinate3import com.tomtom.automotive.integration.client.api.model.quantity.Distance4import com.tomtom.automotive.integration.client.api.model.search.SearchRequest5import com.tomtom.automotive.integration.client.api.model.search.filters.GeoFilter6import com.tomtom.automotive.integration.client.api.search.SearchCallback7import com.tomtom.automotive.integration.client.api.search.SearchFailure8import com.tomtom.automotive.integration.client.api.search.SearchManager9import com.tomtom.automotive.integration.client.api.search.SearchParameters10import com.tomtom.automotive.integration.client.api.search.SearchResponse11import com.tomtom.automotive.integration.client.common.Callback12import com.tomtom.automotive.integration.client.common.Result1314private val TAG = "Search"1516fun searchNearby(searchManager: SearchManager, query: String, currentPosition: Coordinate) {17 // Search within 5000 meters of current position18 val geoFilter = GeoFilter.ByRadius(19 center = currentPosition,20 radius = Distance.meters(5000)21 )2223 val searchRequest = SearchRequest(24 query = query,25 resultLimit = 20,26 geoFilter = geoFilter,27 filters = emptySet(),28 pageSize = 1029 )3031 searchManager.search(32 SearchParameters(searchRequest),33 object : SearchCallback {34 override fun onResult(response: Result<SearchResponse, SearchFailure>) {35 when (response) {36 is Result.Success -> {37 Log.d(TAG, "Found ${response.value.results.size} nearby results")38 }39 is Result.Failure -> {40 Log.e(TAG, "Nearby search failed: ${response.reason}")41 }42 }43 }4445 override fun onFunctionalityUnavailable(reason: Callback.Reason) {46 Log.e(TAG, "Search unavailable: ${reason.devMessage}")47 }48 }49 )50}
Available geo filters
GeoFilter.ByPositionBias- Bias results toward a coordinateGeoFilter.ByRadius- Search within a radius of a coordinateGeoFilter.ByGeoBox- Search within a bounding boxGeoFilter.ByRoute- Search for POIs along the active route
Category-based search
Search for POIs by category (e.g., restaurants, gas stations):
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.Coordinate3import com.tomtom.automotive.integration.client.api.model.quantity.Distance4import com.tomtom.automotive.integration.client.api.model.search.SearchRequest5import com.tomtom.automotive.integration.client.api.model.search.filters.GeoFilter6import com.tomtom.automotive.integration.client.api.model.search.filters.SearchFilter7import com.tomtom.automotive.integration.client.api.model.search.poi.PoiCategory8import com.tomtom.automotive.integration.client.api.search.SearchCallback9import com.tomtom.automotive.integration.client.api.search.SearchFailure10import com.tomtom.automotive.integration.client.api.search.SearchManager11import com.tomtom.automotive.integration.client.api.search.SearchParameters12import com.tomtom.automotive.integration.client.api.search.SearchResponse13import com.tomtom.automotive.integration.client.common.Callback14import com.tomtom.automotive.integration.client.common.Result1516private val TAG = "Search"1718fun searchByCategory(searchManager: SearchManager, categories: Set<PoiCategory>, currentPosition: Coordinate) {19 val geoFilter = GeoFilter.ByRadius(20 center = currentPosition,21 radius = Distance.meters(10000)22 )2324 val filters = setOf(25 SearchFilter.ByPoiCategory(categories)26 )2728 val searchRequest = SearchRequest(29 query = "",30 resultLimit = 30,31 geoFilter = geoFilter,32 filters = filters,33 pageSize = 1034 )3536 searchManager.search(37 SearchParameters(searchRequest),38 object : SearchCallback {39 override fun onResult(response: Result<SearchResponse, SearchFailure>) {40 when (response) {41 is Result.Success -> {42 Log.d(TAG, "Found ${response.value.results.size} category results")43 }44 is Result.Failure -> {45 Log.e(TAG, "Category search failed: ${response.reason}")46 }47 }48 }4950 override fun onFunctionalityUnavailable(reason: Callback.Reason) {51 Log.e(TAG, "Search unavailable: ${reason.devMessage}")52 }53 }54 )55}5657// Example: Find petrol stations58// searchByCategory(searchManager, setOf(PoiCategory.PETROL_STATION), currentPosition)
Filtering by brand name
Search for specific brands:
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.Coordinate3import com.tomtom.automotive.integration.client.api.model.quantity.Distance4import com.tomtom.automotive.integration.client.api.model.search.SearchRequest5import com.tomtom.automotive.integration.client.api.model.search.filters.GeoFilter6import com.tomtom.automotive.integration.client.api.model.search.filters.SearchFilter7import com.tomtom.automotive.integration.client.api.search.SearchCallback8import com.tomtom.automotive.integration.client.api.search.SearchFailure9import com.tomtom.automotive.integration.client.api.search.SearchManager10import com.tomtom.automotive.integration.client.api.search.SearchParameters11import com.tomtom.automotive.integration.client.api.search.SearchResponse12import com.tomtom.automotive.integration.client.common.Callback13import com.tomtom.automotive.integration.client.common.Result1415private val TAG = "Search"1617fun searchByBrand(searchManager: SearchManager, brandNames: Set<String>, currentPosition: Coordinate) {18 val geoFilter = GeoFilter.ByRadius(19 center = currentPosition,20 radius = Distance.meters(15000)21 )2223 val filters = setOf(24 SearchFilter.ByBrandName(brandNames)25 )2627 val searchRequest = SearchRequest(28 query = "coffee",29 resultLimit = 20,30 geoFilter = geoFilter,31 filters = filters,32 pageSize = 533 )3435 searchManager.search(36 SearchParameters(searchRequest),37 object : SearchCallback {38 override fun onResult(response: Result<SearchResponse, SearchFailure>) {39 when (response) {40 is Result.Success -> {41 Log.d(TAG, "Found ${response.value.results.size} brand results")42 }43 is Result.Failure -> {44 Log.e(TAG, "Brand search failed: ${response.reason}")45 }46 }47 }4849 override fun onFunctionalityUnavailable(reason: Callback.Reason) {50 Log.e(TAG, "Search unavailable: ${reason.devMessage}")51 }52 }53 )54}5556// Example: Find Starbucks locations57// searchByBrand(searchManager, setOf("Starbucks"), currentPosition)
Result type filtering
Filter results by type (POI, street, coordinate, etc.):
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.Coordinate3import com.tomtom.automotive.integration.client.api.model.quantity.Distance4import com.tomtom.automotive.integration.client.api.model.search.SearchRequest5import com.tomtom.automotive.integration.client.api.model.search.filters.GeoFilter6import com.tomtom.automotive.integration.client.api.model.search.filters.SearchFilter7import com.tomtom.automotive.integration.client.api.model.search.filters.SearchResultType8import com.tomtom.automotive.integration.client.api.search.SearchCallback9import com.tomtom.automotive.integration.client.api.search.SearchFailure10import com.tomtom.automotive.integration.client.api.search.SearchManager11import com.tomtom.automotive.integration.client.api.search.SearchParameters12import com.tomtom.automotive.integration.client.api.search.SearchResponse13import com.tomtom.automotive.integration.client.common.Callback14import com.tomtom.automotive.integration.client.common.Result1516private val TAG = "Search"1718fun searchPOIsOnly(searchManager: SearchManager, query: String, currentPosition: Coordinate) {19 val geoFilter = GeoFilter.ByRadius(20 center = currentPosition,21 radius = Distance.meters(5000)22 )2324 val filters = setOf(25 SearchFilter.ByResultType(setOf(SearchResultType.POI))26 )2728 val searchRequest = SearchRequest(29 query = query,30 resultLimit = 15,31 geoFilter = geoFilter,32 filters = filters,33 pageSize = 534 )3536 searchManager.search(37 SearchParameters(searchRequest),38 object : SearchCallback {39 override fun onResult(response: Result<SearchResponse, SearchFailure>) {40 when (response) {41 is Result.Success -> {42 Log.d(TAG, "Found ${response.value.results.size} POI results")43 }44 is Result.Failure -> {45 Log.e(TAG, "POI search failed: ${response.reason}")46 }47 }48 }4950 override fun onFunctionalityUnavailable(reason: Callback.Reason) {51 Log.e(TAG, "Search unavailable: ${reason.devMessage}")52 }53 }54 )55}
Available result types
SearchResultType.POI- Points of interestSearchResultType.STREET- Street addressesSearchResultType.COORDINATE- Geographic coordinatesSearchResultType.INTERSECTION- Street intersectionsSearchResultType.AREA- An area on map which represents administrative division of a land i.e. country, state, city.
Parsing search results
Handle different types of search results:
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.search.SearchResult34private val TAG = "Search"56fun handleSearchResult(result: SearchResult) {7 val coordinate = result.data?.coordinate8 val areas = result.data?.areas ?: emptyList()910 when (result) {11 is SearchResult.Poi -> {12 val name = result.poiName13 val address = result.address14 val poiDetails = result.poiDetails1516 Log.d(TAG, "POI: $name at $coordinate")17 Log.d(TAG, "Address: ${address.formattedAddress}")1819 poiDetails?.let {20 val phone = it.phone21 val website = it.website22 val categories = it.category2324 Log.d(TAG, "Phone: $phone, Website: $website")25 Log.d(TAG, "Categories: $categories")26 }27 }2829 is SearchResult.Street -> {30 val address = result.address31 Log.d(TAG, "Street: ${address.formattedAddress} at $coordinate")32 }3334 is SearchResult.Coordinate -> {35 val address = result.address36 Log.d(TAG, "Coordinate: $coordinate, Address: ${address.formattedAddress}")37 }3839 is SearchResult.Area -> {40 Log.d(TAG, "Area at $coordinate, areas: $areas")41 }4243 is SearchResult.Intersection -> {44 val address = result.address45 Log.d(TAG, "Intersection: ${address.formattedAddress} at $coordinate")46 }4748 else -> {49 Log.d(TAG, "Unhandled result type")50 }51 }52}
Converting results to navigable locations
Use search results for trip planning:
1import com.tomtom.automotive.integration.client.api.model.Address2import com.tomtom.automotive.integration.client.api.model.NavigableLocation3import com.tomtom.automotive.integration.client.api.model.search.AddressData4import com.tomtom.automotive.integration.client.api.model.search.SearchResult56fun toNavigableLocation(result: SearchResult): NavigableLocation.Place? {7 val coordinate = result.data?.coordinate ?: return null89 return when (result) {10 is SearchResult.Poi -> {11 NavigableLocation.Place(12 coordinate = coordinate,13 address = result.address.toAddress(),14 name = result.poiName,15 poiDetails = result.poiDetails16 )17 }1819 is SearchResult.Street -> {20 NavigableLocation.Place(21 coordinate = coordinate,22 address = result.address.toAddress(),23 name = result.address.formattedAddress24 )25 }2627 is SearchResult.Coordinate -> {28 NavigableLocation.Place(29 coordinate = coordinate,30 address = result.address.toAddress()31 )32 }3334 else -> {35 NavigableLocation.Place(36 coordinate = coordinate,37 address = null38 )39 }40 }41}4243private fun AddressData.toAddress(): Address {44 return Address(45 houseNumber = houseNumber,46 streetName = streetNames.firstOrNull(),47 cityName = null,48 postalCode = extendedPostalCode,49 stateName = null,50 stateCode = null,51 cityDistrict = null,52 countryName = null,53 countryCode = null,54 extendedPostalCode = extendedPostalCode,55 formattedAddress = formattedAddress56 )57}
Reverse geocoding
The ReverseGeocoderManager converts geographic coordinates into human-readable addresses and place information.
Convert coordinate to address
1import android.util.Log2import com.tomtom.automotive.integration.client.api.model.Coordinate3import com.tomtom.automotive.integration.client.api.model.NavigableLocation4import com.tomtom.automotive.integration.client.api.reversegeocoder.ReverseGeocoderManager5import com.tomtom.automotive.integration.client.api.reversegeocoder.getplacesforcoordinate.GetPlacesForCoordinateCallback6import com.tomtom.automotive.integration.client.api.reversegeocoder.getplacesforcoordinate.GetPlacesForCoordinateFailure7import com.tomtom.automotive.integration.client.api.reversegeocoder.getplacesforcoordinate.GetPlacesForCoordinateParameters8import com.tomtom.automotive.integration.client.api.reversegeocoder.getplacesforcoordinate.GetPlacesForCoordinateResponse9import com.tomtom.automotive.integration.client.common.Callback10import com.tomtom.automotive.integration.client.common.Result11import com.tomtom.automotive.integration.client.common.SdkReleasable1213private val TAG = "ReverseGeocoder"14private var reverseGeocoderReleasable: SdkReleasable? = null1516fun reverseGeocode(reverseGeocoderManager: ReverseGeocoderManager, coordinate: Coordinate) {17 val parameters = GetPlacesForCoordinateParameters(coordinate = coordinate)1819 reverseGeocoderReleasable = reverseGeocoderManager.getPlacesForCoordinate(20 parameters,21 object : GetPlacesForCoordinateCallback {22 override fun onGeocoderResult(23 result: Result<GetPlacesForCoordinateResponse, GetPlacesForCoordinateFailure>24 ) {25 when (result) {26 is Result.Success -> {27 val places = result.value.places2829 when {30 places.isEmpty() -> {31 Log.d(TAG, "No places found for coordinate")32 }33 places.size == 1 -> {34 Log.d(TAG, "Found place: ${places.first().name}")35 logPlace(places.first())36 }37 else -> {38 Log.d(TAG, "Found ${places.size} places")39 places.forEach { place -> logPlace(place) }40 }41 }42 }43 is Result.Failure -> {44 when (result.reason) {45 GetPlacesForCoordinateFailure.INTERNAL_ERROR -> {46 Log.e(TAG, "Reverse geocoding failed: Internal error")47 }48 GetPlacesForCoordinateFailure.UNHANDLED -> {49 Log.e(TAG, "Reverse geocoding failed: Unhandled error")50 }51 }52 }53 }54 }5556 override fun onFunctionalityUnavailable(reason: Callback.Reason) {57 Log.e(TAG, "Reverse geocoding unavailable: ${reason.devMessage}")58 }59 }60 )61}6263private fun logPlace(place: NavigableLocation.Place) {64 Log.d(TAG, "Name: ${place.name}")65 Log.d(TAG, "Coordinate: ${place.coordinate}")6667 place.address?.let {68 Log.d(TAG, "Address: ${it.formattedAddress}")69 Log.d(TAG, "Street: ${it.streetName} ${it.houseNumber ?: ""}")70 Log.d(TAG, "City: ${it.cityName}, ${it.postalCode}")71 }72}7374fun cancelReverseGeocode() {75 reverseGeocoderReleasable?.release()76 reverseGeocoderReleasable = null77}
The response contains a list of NavigableLocation.Place objects which may be empty (no data available), contain a single place (typical case), or contain multiple places.
Paginated results
Fetch additional results using pagination:
1import android.util.Log2import com.tomtom.automotive.integration.client.api.search.SearchCallback3import com.tomtom.automotive.integration.client.api.search.SearchFailure4import com.tomtom.automotive.integration.client.api.search.SearchManager5import com.tomtom.automotive.integration.client.api.search.SearchResponse6import com.tomtom.automotive.integration.client.api.search.nextpage.GetNextPageParameters7import com.tomtom.automotive.integration.client.common.Callback8import com.tomtom.automotive.integration.client.common.Result910private val TAG = "Search"1112fun getNextPage(searchManager: SearchManager, searchSessionId: String) {13 searchManager.getNextPage(14 GetNextPageParameters(searchSessionId),15 object : SearchCallback {16 override fun onResult(response: Result<SearchResponse, SearchFailure>) {17 when (response) {18 is Result.Success -> {19 val additionalResults = response.value.results20 val hasMore = response.value.hasMoreData21 Log.d(TAG, "Fetched ${additionalResults.size} more results, hasMore: $hasMore")22 }23 is Result.Failure -> {24 Log.e(TAG, "Failed to fetch next page: ${response.reason}")25 }26 }27 }2829 override fun onFunctionalityUnavailable(reason: Callback.Reason) {30 Log.e(TAG, "Search unavailable: ${reason.devMessage}")31 }32 }33 )34}3536// Example usage with searchSessionId from initial search response:37// if (searchResponse.hasMoreData) {38// getNextPage(searchManager, searchResponse.searchSessionId)39// }