Java에서 Android KnowMyBoard 앱[탐색 구성 요소]에서 Huawei 사이트 키트 및 지도 키트를 사용하여 매우 쉽게 검색


소개

이 기사에서는 Huawei 사이트 키트, 지도 키트 및 위치 키트를 Android 애플리케이션 KnowMyBoard에 통합하는 방법을 알아봅니다. Account Kit는 대규모 사용자 기반의 앱에 원활한 로그인 기능을 제공합니다.

Android용 위치 키트 SDK는 Android 앱용 위치 관련 API를 제공합니다. 이러한 API는 주로 융합 위치, 활동 식별, 지오펜스, 고정밀 위치, 실내 위치 및 지오코딩과 같은 6가지 기능과 관련됩니다. 이 모드는 휴대폰 및 Huawei 태블릿에 적용됩니다. 우리는 사용자의 위치를 ​​얻기 위해 위치 키트를 사용하고 있습니다.

Android용 Huawei Map SDK는 지도를 개발하기 위해 호출할 수 있는 일련의 API입니다. 이 SDK를 사용하여 지도 표시, 지도 상호 작용, 지도 그리기 및 지도 스타일 사용자 지정을 포함하여 지도 관련 기능을 Android 앱에 쉽게 추가할 수 있습니다.

Huawei 사이트 키트는 키워드 검색,** 주변 장소 검색*, **장소 상세 검색, **장소 검색 제안*을 포함한 장소 검색 서비스를 제공하여 앱이 편리한 장소 관련 서비스를 제공하여 더 많은 사용자를 유치하고 사용자 충성도를 높일 수 있도록 지원합니다. 사이트 키트는 개발자가 장소 기반 품질 앱을 신속하게 구축하는 데 도움이 됩니다.

Site Kit의 핵심 기능을 따라 앱을 빠르게 구축하면 사용자는 주변 세계를 탐색할 수 있습니다.

키워드 검색: 사용자가 입력한 키워드를 기반으로 장소 목록을 반환합니다.
주변 장소 검색: 사용자 기기의 현재 위치를 기준으로 주변 장소를 검색합니다.
장소 상세 검색: 장소에 대한 상세 정보를 검색합니다.
장소 검색 제안: 추천 장소 목록을 반환합니다.
자동완성: 입력된 키워드를 기반으로 자동완성 장소와 추천 장소 목록을 반환합니다.

지원되는 장치


개발 개요

Android Studio IDE를 설치해야 하며 Android 애플리케이션 개발에 대한 사전 지식이 있다고 가정합니다.

하드웨어 요구 사항

Windows 10을 실행하는 컴퓨터(데스크탑 또는 노트북).
디버깅에 사용되는 Android 휴대폰(USB 케이블 포함).
소프트웨어 요구 사항

자바 JDK 1.8 이상.
Android Studio 소프트웨어 또는 Visual Studio 또는 Code가 설치되었습니다.
HMS 코어(APK) 4.X 이상
통합 단계

1단계. Huawei 개발자 계정 및 Huawei 개발자 웹사이트에서 신원 확인을 완료하려면 Huawei ID 등록을 참조하십시오.

**2단계. **AppGallery Connect에서 프로젝트 생성

3단계. HMS Core SDK 추가

코딩을 시작하자

navigation_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/loginFragment">
    <fragment
        android:id="@+id/loginFragment"
        android:name="com.huawei.hms.knowmyboard.dtse.activity.fragments.LoginFragment"
        android:label="LoginFragment"/>
    <fragment
        android:id="@+id/mainFragment"
        android:name="com.huawei.hms.knowmyboard.dtse.activity.fragments.MainFragment"
        android:label="MainFragment"/>
    <fragment
        android:id="@+id/cameraFragment"
        android:name="com.huawei.hms.knowmyboard.dtse.activity.fragments.CameraFragment"
        android:label="fragment_camera"
        tools:layout="@layout/fragment_camera" />
    <fragment
        android:id="@+id/searchFragment"
        android:name="com.huawei.hms.knowmyboard.dtse.activity.fragments.SearchFragment"
        android:label="fragment_search"
        tools:layout="@layout/fragment_search" />
</navigation>


bottom_navigation_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/searchFragment"
        android:icon="@android:drawable/ic_menu_search"
        android:title="@string/search" />
    <item
        android:id="@+id/loginFragment"
        android:icon="@android:drawable/ic_menu_agenda"
        android:title="Home" />
    <item
        android:id="@+id/mainFragment"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_gallery"
        android:title="Gallery" />
    <item
        android:id="@+id/cameraFragment"
        android:icon="@android:drawable/ic_menu_camera"
        app:showAsAction="always"
        android:title="Camera" />
</menu>


SearchFragment.java

public class SearchFragment extends Fragment {


    LoginViewModel loginViewModel;
    View view;
    NavController navController;
    private SearchService searchService;
    SitesAdapter adapter;
    ArrayList<Site> siteArrayList = new ArrayList<>();
    LocationResult locationResult = null;
    public SearchFragment() {
        // Required empty public constructor
    }
    ItemClickListener siteClicklistener = new ItemClickListener(){
        @Override
        public void onItemClicked(RecyclerView.ViewHolder vh, Site site, int pos){
            getActivity().getWindow().setSoftInputMode(
                    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        loginViewModel.setSiteSelected(site);
        navController.navigate(R.id.loginFragment);

        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        getActivity().getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

         view = inflater.inflate(R.layout.fragment_search, container, false);
        loginViewModel = new ViewModelProvider(getActivity()).get(LoginViewModel.class);

        SearchView searchView = view.findViewById(R.id.ed_search);
        RecyclerView recyclerView = view.findViewById(R.id.suggestion_rv);
        navController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment);
        searchView.setFocusable(true);
        searchView.onActionViewExpanded();
        adapter = new SitesAdapter(siteArrayList, getContext(),siteClicklistener);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setHasFixedSize(true);
        loginViewModel.getLocationResult().observeForever(new Observer<LocationResult>() {
            @Override
            public void onChanged(LocationResult locationResult1) {
                locationResult = locationResult1;
            }
        });
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(newText.length() > 4){
                    //keywordSearch(newText);
                    nearByPlacesSearch(newText);
                }
                return false;
            }
        });


        return view;
    }

    void keywordSearch(String search){
        try {
            String key = URLEncoder.encode(Constants.API_KEY, "UTF-8");
            // Instantiate the SearchService object.
            searchService = SearchServiceFactory.create(getContext(),  key);
            // Create a request body.
            TextSearchRequest request = new TextSearchRequest();
            request.setQuery(search);
            if(locationResult!=null){
                 Coordinate location = new Coordinate(locationResult.getLastHWLocation().getLatitude(),locationResult.getLastHWLocation().getLongitude());
                request.setLocation(location);
            }
            request.setRadius(1000);
            request.setCountryCode("IN");
            request.setLanguage("en");
            request.setPageIndex(1);
            request.setPageSize(5);
            request.setChildren(false);
            // Create a search result listener.
            SearchResultListener<TextSearchResponse> resultListener = new SearchResultListener<TextSearchResponse>() {
                // Return search results upon a successful search.
                @Override
                public void onSearchResult(TextSearchResponse results) {
                    if (results == null || results.getTotalCount() <= 0) {
                        return;
                    }
                    List<Site> sites = results.getSites();
                    if(sites == null || sites.size() == 0){
                        return;
                    }

                    siteArrayList.clear();
                    for (Site site : sites) {
                        siteArrayList.add(site);
                    }

                    siteArrayList.addAll(sites);
                    adapter.notifyDataSetChanged();
                }



                // Return the result code and description upon a search exception.
                @Override
                public void onSearchError(SearchStatus status) {
                    Log.i("TAG", "Error : " + status.getErrorCode() + " " + status.getErrorMessage());
                }
            };
            // Call the keyword search API.
            searchService.textSearch(request, resultListener);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }

    void nearByPlacesSearch(String newText){
        try{
            String key = URLEncoder.encode(Constants.API_KEY, "UTF-8");
            // Instantiate the SearchService object.
            searchService = SearchServiceFactory.create(getContext(), key);
            // Create a request body.
            NearbySearchRequest request = new NearbySearchRequest();
            if(locationResult!=null){
                Coordinate location = new Coordinate(locationResult.getLastHWLocation().getLatitude(),locationResult.getLastHWLocation().getLongitude());
                request.setLocation(location);
            }
            request.setQuery(newText);
            request.setRadius(1000);
            request.setHwPoiType(HwLocationType.ADDRESS);
            request.setLanguage("en");
            request.setPageIndex(1);
            request.setPageSize(5);
            request.setStrictBounds(false);
            // Create a search result listener.
            SearchResultListener<NearbySearchResponse> resultListener = new SearchResultListener<NearbySearchResponse>() {
                // Return search results upon a successful search.
                @Override
                public void onSearchResult(NearbySearchResponse results) {
                    if (results == null || results.getTotalCount() <= 0) {
                        return;
                    }
                    List<Site> sites = results.getSites();
                    if(sites == null || sites.size() == 0){
                        return;
                    }
                    siteArrayList.clear();
                    for (Site site : sites) {
                        siteArrayList.add(site);
                    }

                    siteArrayList.addAll(sites);
                    adapter.notifyDataSetChanged();
                }
                // Return the result code and description upon a search exception.
                @Override
                public void onSearchError(SearchStatus status) {
                    Log.i("TAG", "Error : " + status.getErrorCode() + " " + status.getErrorMessage());
                }
            };
            // Call the nearby place search API.
            searchService.nearbySearch(request, resultListener);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}


결과



트릭과 팁

agconnect-services.json 파일이 추가되었는지 확인합니다.
필수 종속 항목이 추가되었는지 확인
AGC에서 서비스가 활성화되어 있는지 확인하십시오.
gradle.build 파일에서 데이터 바인딩 활성화
하단 탐색 ID가 탐색 그래프의 프래그먼트 ID와 동일해야 합니다.
서비스를 호출하기 전에 apk 키를 설정했는지 확인하십시오.

결론

이 기사에서는 Huawei 사이트 키트, 지도 키트 및 위치 키트를 Android 애플리케이션 KnowMyBoard에 통합하는 방법을 배웠습니다. 여기에서 이전 기사 part-3를 살펴볼 수도 있습니다. 희망 사이트 키트 및 맵 키트 기능도 이 샘플과 같이 필요에 따라 사용할 수 있습니다.

읽어주셔서 정말 감사합니다. 이 기사가 Android 애플리케이션 KnowMyBoard에서 Huawei 사이트 키트, 지도 키트 및 위치 키트의 통합을 이해하는 데 도움이 되기를 바랍니다.

참조

Map KitTraining video

Site KitTraining video

좋은 웹페이지 즐겨찾기