The Site SDK provides place search services that allow your users to use location-based services more conveniently, helping you quickly acquire users. Site Kit provides the following core capabilities for you to quickly build apps with which your users can explore the world around them:
In this codelab, you will create a place-related app, for example:
To integrate Site Kit, you must complete the following preparations:
dependencies {
implementation 'com.huawei.hms:site:{version}'
}
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_gravity="bottom"
android:background="#D3D3D3"
android:gravity="center_vertical"
android:paddingLeft="5dp"
android:text="Parameters"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Query: " />
<EditText
android:id="@+id/edit_text_text_search_query"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:autofillHints=""
android:hint=""
android:imeOptions="actionGo"
android:inputType="text"
android:text="Eiffel Tower" />
</LinearLayout>
<Button
android:id="@+id/button_text_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="search"
android:text="Search"
android:textAllCaps="false" />
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_gravity="bottom"
android:background="#D3D3D3"
android:gravity="center_vertical"
android:paddingLeft="5dp"
android:text="Result"
android:textSize="16sp" />
<TextView
android:id="@+id/response_text_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
</LinearLayout>
</ScrollView>
package com.huawei.codelab.sitecodelab;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.huawei.hms.site.api.SearchResultListener;
import com.huawei.hms.site.api.SearchService;
import com.huawei.hms.site.api.SearchServiceFactory;
import com.huawei.hms.site.api.model.AddressDetail;
import com.huawei.hms.site.api.model.SearchStatus;
import com.huawei.hms.site.api.model.Site;
import com.huawei.hms.site.api.model.TextSearchRequest;
import com.huawei.hms.site.api.model.TextSearchResponse;
import androidx.appcompat.app.AppCompatActivity;
/**
* Site activity entrance class.
*/
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private SearchService searchService;
private TextView resultTextView;
private EditText queryInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
searchService = SearchServiceFactory.create(this, URLEncoder.encode("your_api_key", "utf-8"));
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "encode apikey error");
}
queryInput = findViewById(R.id.edit_text_text_search_query);
resultTextView = findViewById(R.id.response_text_search);
}
}
Kotlin sample code:
package com.huawei.codelab.sitecodelab
import android.os.Bundle
import android.util.Log
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import com.huawei.hms.site.api.SearchService
import com.huawei.hms.site.api.SearchServiceFactory
import java.io.UnsupportedEncodingException
import java.net.URLEncoder
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "MainActivity"
}
private lateinit var searchService: SearchService
private lateinit var resultTextView: TextView
private lateinit var queryInput: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Fixme: Please replace "API key" with your API KEY
try {
searchService = SearchServiceFactory.create(this, URLEncoder.encode("your_api_key", "utf-8"))
} catch (e: UnsupportedEncodingException) {
Log.e(TAG, "encode apikey error")
}
queryInput = findViewById(R.id.edit_text_text_search_query)
resultTextView = findViewById(R.id.response_text_search)
}
}
public void search(View view) {
TextSearchRequest textSearchRequest = new TextSearchRequest();
textSearchRequest.setQuery(queryInput.getText().toString());
textSearchRequest.setHwPoiType(HwLocationType.TOWER);
searchService.textSearch(textSearchRequest, new SearchResultListener<TextSearchResponse>() {
@Override
public void onSearchResult(TextSearchResponse textSearchResponse) {
StringBuilder response = new StringBuilder("\n");
response.append("success\n");
int count = 1;
AddressDetail addressDetail;
if (null != textSearchResponse) {
if (null != textSearchResponse.getSites()) {
for (Site site : textSearchResponse.getSites()) {
addressDetail = site.getAddress();
response
.append(String.format("[%s] name: %s, formatAddress: %s, country: %s, countryCode: %s \r\n",
"" + (count++), site.getName(), site.getFormatAddress(),
(addressDetail == null ? "" : addressDetail.getCountry()),
(addressDetail == null ? "" : addressDetail.getCountryCode())));
}
} else {
response.append("textSearchResponse.getSites() is null!");
}
} else {
response.append("textSearchResponse is null!");
}
Log.d(TAG, "search result is : " + response);
resultTextView.setText(response.toString());
}
@Override
public void onSearchError(SearchStatus searchStatus) {
Log.e(TAG, "onSearchError is: " + searchStatus.getErrorCode());
}
});
}
Kotlin sample code:
fun search(view: View?) {
val textSearchRequest = TextSearchRequest()
textSearchRequest.query = queryInput.text.toString()
textSearchRequest.hwPoiType = HwLocationType.TOWER
searchService.textSearch(textSearchRequest, object : SearchResultListener<TextSearchResponse> {
override fun onSearchResult(textSearchResponse: TextSearchResponse) {
val response = StringBuilder("\n")
response.append("success\n")
var count = 1
var addressDetail: AddressDetail
for (site in textSearchResponse.sites) {
addressDetail = site.address
response.append(
String.format(
"[%s] name: %s, formatAddress: %s, country: %s, countryCode: %s \r\n",
"" + count++, site.name, site.formatAddress,
if (addressDetail == null) "" else addressDetail.country,
if (addressDetail == null) "" else addressDetail.countryCode
)
)
}
Log.d(TAG, "search result is : $response")
resultTextView.text = response.toString()
}
override fun onSearchError(searchStatus: SearchStatus) {
Log.e(TAG, "onSearchError is: " + searchStatus.errorCode)
}
})
}
Open Gradle built in Android Studio and double-click installDebug to install the developed demo app.
Open the developed app, tap Search to search for places based on the preset search keyword Eiffel Tower, and check whether the search results can be properly displayed.
Well done. You have successfully completed this codelab and learned how to:
For more information about Site Kit, please refer to Site Kit Development Guide.
You can click here to download the source code.