How Can an App Show More POI Details to Users
Tags: java, programming, tutorial, poi
Published: 2022-08-09 03:41:07

With the increasing popularity of the mobile Internet, mobile apps are now becoming an integral part of our daily lives and provide increasingly more diverse functions that bring many benefits to users. One such function is searching for Point of Interests (POIs) or places, such as banks and restaurants, in an app.

When a user searches for a POI in an app, besides general information about the POI, such as the name and location, they also expect to be shown other relevant details. For example, when searching for a POI in a taxi-hailing app, a user usually expects the app to display both the searched POI and other nearby POIs, so that the user can select the most convenient pick-up and drop-off point. When searching for a bank branch in a mobile banking app, a user usually wants the app to show both the searched bank branch and nearby POIs of a similar type and their details such as business hours, telephone numbers, and nearby roads.

However, showing POI details in an app is usually a challenge for developers of non-map-related apps, because it requires a large amount of detailed POI data that is generally hard to collect for most app developers. So, wouldn't it be great if there was a service which an app can use to provide users with information about POI (such as the business hours and ratings) when they search for different types of POIs (such as hotels, restaurants, and scenic spots) in the app?

Fortunately, HMS Core [Site Kit](https://developer.huawei.com/consumer/en/hms/huawei-sitekit/?ha_source=hms3) provides a one-stop POI search service, which boasts more than 260 million POIs in over 200 countries and regions around the world. In addition, the service supports more than 70 languages, empowering users to search for places in their own native languages. The place detail search function in the kit allows an app to obtain information about a POI, such as the name, address, and longitude and latitude, based on the unique ID of the POI. For example, a user can search for nearby bank branches in a mobile banking app, and view information about each branch, such as their business hours and telephone numbers, or search for the location of a scenic spot and view information about nearby hotels and weather forecasts in a travel app, thanks to the place detail search function. The [place detail search](https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/android-sdk-place-details-0000001050156636?ha_source=hms3) function can even be utilized by location-based games that can use the function to show in-game tasks and rankings of other players at a POI when a player searches for the POI in the game.

The integration process for this kit is straightforward, which I'll demonstrate below.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4kkbaqg6umotf0mskid.png)

## Demo

The screenshot below can give you an impression on the place detail search function.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rxw7qlw70b9cxvg76hy1.png)

## Integration Procedure

### 1 Preparations

Before getting started, you'll need to make some preparations, such as configuring your app information in AppGallery Connect, integrating the Site SDK, and configuring the obfuscation configuration file.

If you use Android Studio, you can integrate the SDK into your project via the Maven repository. The purpose of configuring the obfuscation configuration file is to prevent the SDK from being obfuscated.

You can follow instructions [here](https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/android-sdk-config-agc-0000001050158579?ha_source=hms3) to make relevant preparations. In this article, I won't be describing the preparation steps.

### 2 Developing Place Detail Search

After making relevant preparations, you will need to implement the place detail search function for obtaining POI details. The process is as follows:

i. Declare a **SearchService** object and use **SearchServiceFactory** to instantiate the object.

When creating a **SearchService** object, you need to pass the **Context** parameter and API key. If you want to display an update wizard when HMS Core (APK) needs to be updated, you are advised to pass the **Context** parameter of the **Activity** type. As for the API key, it is generated when you create an app on the HUAWEI Developers website. Note that you need encode the API key using the **URLEncoder.encode("**_Your apiKey_**", "UTF-8")** method.

ii. Create a **DetailSearchRequest** object and set relevant parameters.

The object will be used as the request body for searching for POI details. Relevant parameters are as follows:

- **siteId**: ID of a POI. This parameter is mandatory.

- **language**: language in which search results are displayed. English will be used if no language is specified, and if English is unavailable, the local language will be used.

- **children**: indicates whether to return information about child nodes of the POI. The default value is **false**, indicating that child node information is not returned. If this parameter is set to **true**, all information about child nodes of the POI will be returned.

iii. Create a **SearchResultListener** object to listen for the search result.

iv. Use the created **SearchService** object to call the **detailSearch()** method and pass the created **DetailSearchRequest** and **SearchResultListener** objects to the method.

v. Obtain the **DetailSearchResponse** object using the created **SearchResultListener** object. You can obtain a **Site** object from the **DetailSearchResponse** object and then parse it to obtain the search results.

The sample code is as follows:

```
// Declare a SearchService object.
private SearchService searchService; 
// Create a SearchService instance. 
searchService = SearchServiceFactory.create(this, "
API key
");
// Create a request body.
DetailSearchRequest request = new DetailSearchRequest(); 
request.setSiteId("
C2B922CC4651907A1C463127836D3957
"); 
request.setLanguage("
fr
"); 
request.setChildren(
false
);
// Create a search result listener.
SearchResultListener<DetailSearchResponse> resultListener = new SearchResultListener<DetailSearchResponse>() { 
    // Return the search result when the search is successful.
    @Override 
    public void onSearchResult(DetailSearchResponse result) { 
        Site site;
        if (result == null || (site = result.getSite()) == null) { 
            return; 
        }
         Log.i("TAG", String.format("siteId: '%s', name: %s\r\n", site.getSiteId(), site.getName())); 
    } 
    // Return the result code and description when a search exception occurs.
    @Override 
    public void onSearchError(SearchStatus status) { 
        Log.i("TAG", "Error : " + status.getErrorCode() + " " + status.getErrorMessage()); 
    } 
}; 
// Call the place detail search API.
searchService.detailSearch(request, resultListener);
```
You have now completed the integration process and your app should be able to show users details about the POIs they search for.

## Conclusion

Mobile apps are now an integral part of our daily life. To improve user experience and provide users with a more convenient experience, mobile apps are providing more and more functions such as POI search.

When searching for POIs in an app, besides general information such as the name and location of the POI, users usually expect to be shown other context-relevant information as well, such as business hours and similar POIs nearby. However, showing POI details in an app can be challenging for developers of non-map-related apps, because it requires a large amount of detailed POI data that is usually hard to collect for most app developers.

In this article, I demonstrated how I solved this challenge using the place detail search function, which allows my app to show POI details to users. The whole integration process is straightforward and cost-efficient, and is an effective way to show POI details to users.