简介

位置服务SDK提供位置查询服务,帮助开发者的用户更加方便地使用位置相关服务,以及帮助开发者快速获取用户。Site Kit通过提供如下核心能力,帮助开发者快速构建基于位置服务的产品,满足用户对探索周边地点的需求:

您将建立什么

开发者通过位置服务SDK可以开发围绕位置搜索的App,比如:

您将会学到什么

硬件要求

软件要求

集成Site Kit能力,需要完成以下准备工作

具体操作,请按照《HUAWEI HMS Core集成准备》中详细说明来完成。

1、添加应用的AppGallery Connect配置文件。

(a) 下载应用中的"agconnect-services.json"配置文件。

(b) 将"agconnect-services.json"配置在模块级目录下,如下图所示。

2、添加编译依赖。

(a) 打开模块级的build.gradle文件。

(b) 在"dependencies "中添加如下编译依赖。

dependencies { implementation 'com.huawei.hms:site:{version}' }

(c) 在文件头添加配置 apply plugin: 'com.huawei.agconnect'

  1. 在layout中添加EditText,用来输入查询的关键字;添加TextView,用来展示查询结果;以及其他一些组件。
    <?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>
  2. 声明SearchService对象,并在onCreate方法中通过SearchServiceFactory实例化SearchService。创建SearchService实例需要传入Context和API key参数。Context参数建议传入Activity类型,否则需要升级HMS Core(APK)时不会弹出升级界面。API key在AppGallery Connect上创建应用的时候连同agconnect-services.json文件同时生成的。注意需要对API key进行encodeURI编码。
    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); } }

3、创建TextSearchRequest对象,它是位置搜索的请求体。其中query是必选参数,其他是可选参数:

4、调用textSearch接口,需传入上一步创建的TextSearchRequest和结果监听对象SearchResultListener,从回调的onSearchResult方法中获取结果,并展示地点信息。

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()); } }); }

编译、加载、调试

使用Android Studio自带的Gradle编译工具,双击installDebug,即可安装Demo。

调测准备

打开开发调试版本的位置服务App后,查询字符串已预置Eiffel Tower,点击Search按钮,查看是否能获取到结果。

干得好,你已经成功完成了Codelab并学到了:

详细开发者文档请参见位置服务

您可以点击下方按钮下载源码。

源码下载

已复制代码