• 【HMS Core】集成多种HMS Core服务,让APP成为旅行小助手


    1 介绍

    Duration: 5:00

    总览

    旅行者能够使用该应用在华为地图上搜索附近名胜景点、游玩去处或是附近ATM、餐馆和医院等。

    服务场景描述

    Tourism应用通过集成机器学习服务的地标识别能力,能够提供旅行过程所有必要的信息,还可以识别图片中的地标建筑。当传入图片时,用户可以获取识别出的地标信息以及搜索服务提供的相关图片。相关图片可以通过使用全景服务以全景图片或柱状全景图片形式快速展示。应用使用位置服务向用户展示名胜景点或是打算前去的地点位置。

    特性

    服务

    华为账号/手机号登录

    认证服务,账号服务

    获取定位并展示在地图上

    定位服务,地图服务

    位置搜索

    位置服务

    加载地标相关图片

    搜索服务

    360°全景图片与交互

    全景服务

    2 您需要什么

    Duration: 1:00

    硬件需求

    • 一部搭载安卓6或更高版本系统的手机,用于调试应用。

    请提前准备上述硬件设备。

    软件需求

    • Android Studio (下载),本次Codelab使用Windows环境。

    • JDK 1.8或以上版本(下载)。

    请提前准备上述软件环境。

    3 能力接入准备

    Duration: 2:00

    首先,您需要在AppGallery Connect上启用HMS Core的相关服务。

    启用前,请完成以下准备工作:

    • AppGallery Connect上创建一个应用。

    • 在Android Studio中新建一个项目。

    • 生成签名证书。

    • 生成签名证书指纹。

    • 配置签名证书指纹。

    • 添加应用包名并保存配置文件。

    • 在项目级build.gradle文件中添加AppGallery Connect插件和Maven仓。

    • 在Android Studio中配置签名证书。

    详情请参见HUAWEI HMS Core集成准备

    4 开通服务

    Duration: 5:00

    1. 登录AppGallery Connect,点击“项目设置”中“API管理”页签,开通如下服务的API权限。

      • 认证服务

      • 地图服务

      • 定位服务

      • 位置服务

      • 搜索服务

      • 机器学习服务

    cke_15906.png

    说明:以上API权限默认已开通。如未开通,请手动开通。

    2.开启地图服务的额外权限,请参考地图服务(Android)

     服务权限开启完毕后,您可进入下一个开发步骤。

    5 配置开发环境

    Duration: 3:00

    1. 点击“agconnect-services.json”下载配置文件。

    2. 复制agconnect-services.json文件至项目应用级根目录中。

    cke_41254.png

    3.打开Android Studio项目中根目录下的“build.gradle”文件。

    cke_51340.png

    4.配置如下信息。

    1. buildscript {
    2. repositories {
    3. mavenLocal()
    4. google()
    5. mavenCentral()
    6. maven { url 'https://developer.huawei.com/repo/' }
    7. }
    8. dependencies {
    9. classpath 'com.android.tools.build:gradle:7.2.0'
    10. classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    11. }
    12. }
    13. plugins {
    14. id 'com.android.application' version '7.2.1' apply false
    15. id 'com.android.library' version '7.2.1' apply false
    16. }
    17. task clean(type: Delete) {
    18. delete rootProject.buildDir
    19. }

    5. 在settings.gradle文件中配置如下信息。

    1. pluginManagement {
    2. repositories {
    3. gradlePluginPortal()
    4. google()
    5. mavenCentral()
    6. maven { url 'https://developer.huawei.com/repo/' }
    7. }
    8. }
    9. dependencyResolutionManagement {
    10. repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    11. repositories {
    12. google()
    13. mavenCentral()
    14. maven { url 'https://developer.huawei.com/repo/' }
    15. }
    16. }
    17. rootProject.name = "DiscoverTourismApp"
    18. include ':app'

    6.打开应用级目录下的build.gradle文件。

    cke_104668.png

    7.在应用级build.gradle文件里添加signing configs和所需的依赖。

    1. apply plugin: 'com.huawei.agconnect'
    2. android {
    3. ...
    4. signingConfigs {
    5. release {
    6. storeFile file("xxx.jks")
    7. keyAlias 'xxx'
    8. keyPassword 'xxx'
    9. storePassword 'xxx'
    10. v1SigningEnabled true
    11. v2SigningEnabled true
    12. }
    13. }
    14. defaultConfig {...}
    15. buildTypes {
    16. debug{...}
    17. release{...}
    18. }
    19. }
    1. implementation 'com.huawei.agconnect:agconnect-core:1.6.5.300'
    2. implementation 'com.huawei.agconnect:agconnect-auth:1.6.5.300'
    3. implementation 'com.huawei.hms:hwid:6.4.0.301'
    4. implementation 'com.huawei.hms:site:4.0.3.300'
    5. implementation 'com.huawei.hms:maps:5.0.3.302'
    6. implementation 'com.huawei.hms:location:5.0.4.300'
    7. implementation 'com.huawei.hms:ml-computer-vision-segmentation:2.2.0.300'
    8. implementation 'com.huawei.hms:searchkit:5.0.4.303'
    9. implementation 'com.huawei.hms:panorama:5.0.2.306'
    10. implementation 'com.huawei.hms:panorama-local:5.0.2.306'

    8.在AndroidManifest.xml文件里添加所需权限。

    1. android:name="android.permission.INTERNET" />
    2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    4. <uses-permission android:name="android.permission.CAMERA" />
    5. <uses-permission android:name="com.huawei.permission.SECURITY_DIAGNOSE" />
    6. <uses-permission android:name="android.permission.WAKE_LOCK" />
    7. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    8. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    9. <uses-permission android:name="android.permission.INTERNET" />
    10. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    11. <uses-permission android:name="com.huawei.hms.permission.ACTIVITY_RECOGNITION" />
    12. <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    13. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    14. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    6 开发步骤

    登录成功后,用户进入应用面板页面,页面包括如下图所示的NEARBY和LANDMARK RECOGNITION模块。

    cke_151822.pngcke_157419.png

    7 集成认证服务

    Duration: 1:00

    认证服务提供多种认证方式,包括手机号、Facebook和谷歌账号等。本次codelab使用华为账号认证。首先开通华为账号认证模式来获取用户的华为账号信息。

    cke_169508.png

    1. 集成认证服务SDK。

      添加下述依赖。

      implementation "com.huawei.agconnect:agconnect-auth:"

      说明:本示例中使用的认证服务版本为1.6.0.300。

      您在开发时,请使用最新版本

    2. 开发华为账号登录功能。

      认证服务在用户使用华为账号登录时认证用户。

      导入认证服务所需的类。

      1. import com.huawei.hms.support.account.AccountAuthManager;
      2. import com.huawei.hms.support.account.request.AccountAuthParams;
      3. import com.huawei.hms.support.account.request.AccountAuthParamsHelper;
      4. import com.huawei.hms.support.account.result.AuthAccount;
      5. import com.huawei.hms.support.account.service.AccountAuthService;
      6. import com.huawei.hms.support.hwid.ui.HuaweiIdAuthButton;

      Java

      LoginActivity.java

      设计华为账号登录按钮样式。

      1. android:id="@+id/btn_login_account"
      2. android:layout_width="wrap_content"
      3. android:layout_height="wrap_content"
      4. android:layout_gravity="center"
      5. android:gravity="center"
      6. app:hwid_color_policy="hwid_color_policy_blue"/>
      7. HuaweiIdAuthButton huaweiIdAuthButton = findViewById(R.id.btn_login_account);

      LoginActivity.java

      当点击按钮时执行回调。

      1. mAuthParam = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM)
      2. .setEmail()
      3. .createParams();
      4. mAuthService = AccountAuthManager.getService(this, mAuthParam);
      5. Task task = mAuthService.silentSignIn();
      6. task.addOnSuccessListener(authAccount -> signinResult(authAccount));
    3. 调用getSignInIntent接口获取登录信息。

      登录成功后,在onActivityResult中调用getSignInIntent接口获取登录接口。

      Java

      LoginActivity.java

      1. @Override
      2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      3. super.onActivityResult(requestCode, resultCode, data);
      4. if (requestCode == REQUEST_CODE_SIGN_IN) {
      5. Task authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
      6. if (authAccountTask.isSuccessful()) {
      7. AuthAccount authAccount = authAccountTask.getResult();
      8. signinResult(authAccount);
      9. } else {
      10. AppLog.logE(TAG, "sign in failed : " + ((ApiException)
      11. authAccountTask.getException()).getStatusCode());
      12. }
      13. }
      14. }

    处理用户信息。

    Java

    处理登录结果。

    1. private void signinResult(AuthAccount authAccount) {
    2. TourismSharedPref.initializeInstance(this);
    3. TourismSharedPref.getInstance().putString(Constants.USER_NAME, authAccount.getDisplayName());
    4. TourismSharedPref.getInstance().putString(Constants.EMAIL, authAccount.getEmail());
    5. TourismSharedPref.getInstance().putString(Constants.ALREADY_LOGIN, "1");
    6. Intent i = new Intent(LoginActivity.this, MainActivity.class);
    7. i.putExtra("name", authAccount.getDisplayName());
    8. i.putExtra("email", authAccount.getEmail());
    9. startActivity(i);
    10. finish();
    11. }

    效果:

    用户手机上打开Main Activity页面。

    cke_296093.png

    8 集成定位服务

    Duration: 1:00

    定位服务(Location Kit)为您提供快速、精准地获取用户位置信息的能力,构建全球定位服务能力,助力您发展全球业务。

    1. 添加依赖。

      添加定位服务依赖。

      1. dependencies {
      2. implementation "com.huawei.hms:location:"
      3. }

      说明:本示例中使用的定位服务SDK版本为6.0.0.302。

      您在开发时,请使用最新版本

    2. 在Manifest文件中添加如下权限。

      1. "android.permission.ACCESS_FINE_LOCATION" />
      2. "android.permission.ACCESS_COARSE_LOCATION" />

      Java

      a.添加运行时权限。

      1. if (checkPermission()) {
      2. getLastKnownLocation();
      3. checkLocationSettings();
      4. hMap.setMyLocationEnabled(true);
      5. //启用my-location图标。
      6. hMap.getUiSettings().setMyLocationButtonEnabled(true);
      7. } else {
      8. Toast.makeText(getApplicationContext(),"Permission needed",Toast.LENGTH_LONG).show();
      9. //申请权限。
      10. requestPermission();
      11. }

      b.选择以下的一种方式动态申请权限。

      checkLocationPermission()

      1. public boolean checkPermission() {
      2. int fineloc = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION);
      3. int coarseloc = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION);
      4. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
      5. return fineloc == PackageManager.PERMISSION_GRANTED && coarseloc == PackageManager.PERMISSION_GRANTED;
      6. } else {
      7. int backloc = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_BACKGROUND_LOCATION);
      8. return fineloc == PackageManager.PERMISSION_GRANTED && coarseloc == PackageManager.PERMISSION_GRANTED && backloc == PackageManager.PERMISSION_GRANTED;
      9. }
      10. }

      requestPermissionForLocation()

      1. @TargetApi(Build.VERSION_CODES.M)
      2. private void requestPermission() {
      3. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
      4. requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_ACCESS_PERMISSION_CODE);
      5. } else {
      6. requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION
      7. }, REQUEST_ACCESS_PERMISSION_CODE);
      8. }
      9. }

      c.处理权限。

      1. @TargetApi(Build.VERSION_CODES.M)
      2. @Override
      3. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      4. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      5. if (requestCode == REQUEST_ACCESS_PERMISSION_CODE) {
      6. if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      7. } else {
      8. }
      9. }
      10. }

    添加下述代码获取定位。

    1. private void getLastLocation() {
    2. try {
    3. Task lastLocation = mFusedLocationProviderClient.getLastLocation();
    4. lastLocation.addOnSuccessListener(location -> {
    5. if (location == null) {
    6. Log.i(TAG, "getLastLocation onSuccess location is null");
    7. return;
    8. }
    9. String latlong = "" + location.getLatitude() + " -- " + location.getLongitude();
    10. Log.i(TAG, "getLastLocation onSuccess location[Longitude,Latitude]:"
    11. + location.getLongitude() + "," + location.getLatitude());
    12. mCurrentLocation.setLatitude(location.getLatitude());
    13. mCurrentLocation.setLongitude(location.getLongitude());
    14. return;
    15. }).addOnFailureListener(e -> Log.e(TAG, "getLastLocation onFailure:" + e.getMessage()));
    16. } catch (Exception e) {
    17. Log.e(TAG, "getLastLocation exception:" + e.getMessage());
    18. }
    19. }

    效果:

    cke_666102.png

    红色标记为当前定位。

    9 集成地图服务

    Duration: 1:00

    地图Android SDK是一套地图开发调用接口。地图数据覆盖大部分国家和地区,支持多语言。地图采用WGS84 GPS坐标系,满足绝大多数海外地图开发的需求。

    1. 添加依赖。

      1. dependencies {
      2. implementation "com.huawei.hms:maps:"
      3. }
    2. 开发地图功能。

      a.在Manifest文件中添加如下依赖。

      1. "android.permission.ACCESS_COARSE_LOCATION"/>
      2. "android.permission.ACCESS_FINE_LOCATION"/>
      3. "android.permission.INTERNET"/>
      4. "android.permission.ACCESS_NETWORK_STATE"/>

      b.在布局文件中添加SupportMapFragment类。

      Java

      1. android:id="@+id/mapfragment_mapfragmentdemo"
      2. class="com.huawei.hms.maps.SupportMapFragment"
      3. android:layout_width="match_parent"
      4. android:layout_height="match_parent"
      5. app:cameraTargetLat="48.893478"
      6. app:cameraTargetLng="2.334595"
      7. app:cameraZoom="10"
      8. app:layout_constraintBottom_toBottomOf="parent"
      9. app:layout_constraintEnd_toEndOf="parent"
      10. app:layout_constraintStart_toStartOf="parent"
      11. app:layout_constraintTop_toTopOf="parent" />

    c.创建Map实例。

    1. mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment_mapfragmentdemo);
    2. mSupportMapFragment.getMapAsync(this);
    3. @Override
    4. public void onMapReady(HuaweiMap huaweiMap) {
    5. HuaweiMap hMap = huaweiMap;
    6. LatLng hospitalLatLng = new LatLng(lat, lng);
    7. CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(hospitalLatLng, 12);
    8. huaweiMap.moveCamera(cameraUpdate);
    9. hMap.addMarker(new MarkerOptions().position(hospitalLatLng));
    10. }

    效果:

    cke_913568.png

    说明:本示例中使用的地图服务SDK版本为6.0.0.31。

    您在开发时,请使用最新版本

    10 集成位置服务

    Duration: 1:00

    位置服务(Site Kit)提供海量POI数据,位置查询、时区查询、地理编码、行政区域等多类搜索服务能力,帮助您的应用吸引更多用户。

    1. 添加依赖。

      添加位置服务的依赖。

      1. dependencies {
      2. implementation "com.huawei.hms:site:"
      3. }

      说明:本示例中使用的位置服务SDK版本为6.0.0.302。

      您在开发时,请使用最新版本

    添加下述代码获取地点列表。

    1. private void nearbySearch(int type, Double lat, Double lng) {
    2. util.showProgressBar(this);
    3. NearbySearchRequest request = new NearbySearchRequest();
    4. request.setLocation(new Coordinate(lat, lng));
    5. if(type==1){
    6. request.setPoiType(LocationType.SHOPPING_MALL);
    7. }else if(type==2){
    8. request.setPoiType(LocationType.RESTAURANT);
    9. }else if(type==3){
    10. request.setPoiType(LocationType.HOSPITAL);
    11. }else if(type==4){
    12. request.setPoiType(LocationType.ATM);
    13. }
    14. request.setRadius(10000);
    15. searchService.nearbySearch(request, searchResultListener);
    16. }
    1. SearchResultListener searchResultListener = new SearchResultListener() {
    2. @Override
    3. public void onSearchResult(NearbySearchResponse results) {
    4. StringBuilder stringBuilder = new StringBuilder();
    5. if (results != null) {
    6. List sites = results.getSites();
    7. NearByAdapter nearByAdapter = new NearByAdapter(NearbySearchActivity.this, sites);
    8. recyclerView.setAdapter(nearByAdapter);
    9. util.stopProgressBar();
    10. }
    11. showSuccessResult(stringBuilder.toString());
    12. }
    13. @Override
    14. public void onSearchError(SearchStatus status) {
    15. showFailResult("", status.getErrorCode(), status.getErrorMessage());
    16. }
    17. };

    效果:

    cke_1059917.png

    上图展示的是购物中心列表。

    11 集成机器学习服务

    Duration: 1:00

    得益于华为长期技术积累,ML Kit为开发者提供简单易用、服务多样、技术领先的机器学习能力,助力开发者更快更好地开发各类AI应用。

    1. 添加依赖。

      添加机器学习服务的依赖。

      1. dependencies {
      2. implementation "com.huawei.hms:ml-computer-vision-segmentation:"
      3. }

      说明:本示例中使用的机器学习服务SDK版本为6.0.0.302。

      您在开发时,请使用最新版本

    添加下述代码获取地标名称和地址。

    1. private void analyzer(Bitmap bitmap) {
    2. util.showProgressBar(getActivity());
    3. analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer();
    4. MLRemoteLandmarkAnalyzerSetting settings = new MLRemoteLandmarkAnalyzerSetting.Factory()
    5. .setLargestNumOfReturns(1)
    6. .setPatternType(MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN)
    7. .create();
    8. this.analyzer = MLAnalyzerFactory.getInstance()
    9. .getRemoteLandmarkAnalyzer(settings);
    10. //通过android.graphics.Bitmap构造MLFrame,建议图片尺寸大于640 x 640像素。
    11. // Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.landmark_image);
    12. MLFrame mlFrame = new MLFrame.Creator().setBitmap(bitmap).create();
    13. //设置ApiKey。
    14. MLApplication.getInstance().setApiKey(getResources().getString(R.string.api_key));
    15. //设置access token。
    16. // MLApplication.getInstance().setAccessToken(MainActivity.accessToken);
    17. Task> task = this.analyzer.asyncAnalyseFrame(mlFrame);
    18. task.addOnSuccessListener(new OnSuccessListener>() {
    19. @Override
    20. public void onSuccess(List landmarkResults) {
    21. //识别成功的处理逻辑。
    22. displaySuccess(landmarkResults.get(0));
    23. }
    24. }).addOnFailureListener(new OnFailureListener() {
    25. @Override
    26. public void onFailure(Exception e) {
    27. //识别失败的处理逻辑。
    28. displayFailure(e);
    29. }
    30. });
    31. }
    32. private void displayFailure(Exception exception) {
    33. String error = "Failure. ";
    34. try {
    35. MLException mlException = (MLException) exception;
    36. error += "error code: " + mlException.getErrCode() + "\n" + "error message: " + mlException.getMessage();
    37. } catch (Exception e) {
    38. error += e.getMessage();
    39. }
    40. }
    41. private void displaySuccess(MLRemoteLandmark landmark) {
    42. String result = "";
    43. if (landmark.getLandmark() != null) {
    44. result = "Landmark: " + landmark.getLandmark();
    45. }
    46. location_name=landmark.getLandmark();
    47. result += "\nPositions: ";
    48. if (landmark.getPositionInfos() != null) {
    49. for (MLCoordinate coordinate : landmark.getPositionInfos()) {
    50. result += "\nLatitude:" + coordinate.getLat();
    51. result += "\nLongitude:" + coordinate.getLng();
    52. lat=coordinate.getLat();
    53. lng=coordinate.getLng();
    54. }
    55. }
    56. this.landMark_text.setText(landmark.getLandmark()+"\n\n"+landmark.getLandmarkIdentity());
    57. util.stopProgressBar();
    58. }

    效果:

    cke_1188489.png

    应用识别出图片上的地标名称为Mughal Holidays。

    12 集成搜索服务

    Duration: 1:00

    Search Kit通过端侧SDK和云侧API方式,全面开放Petal Search搜索能力,使能生态合作伙伴快速构建更好的移动应用搜索体验。

    1. 添加依赖。

      添加搜索服务的依赖。

      1. dependencies {
      2. implementation "com.huawei.hms:searchkit:"
      3. }

      说明:本示例中使用的搜索服务SDK版本为6.0.0.302。

      您在开发时,请使用最新版本

    添加下述代码获取附近地点。

    1. public void initRetrofit() {
    2. util.showProgressBar(this);
    3. ApplicationInfo appInfo = null;
    4. String baseUrl = "";
    5. try {
    6. appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
    7. baseUrl = appInfo.metaData.getString("baseUrl");
    8. } catch (PackageManager.NameNotFoundException e) {
    9. }
    10. QueryService service = NetworkManager.getInstance().createService(this, baseUrl);
    11. service.getRequestToken(
    12. "client_credentials",
    13. getResources().getString(R.string.app_id),
    14. getResources().getString(R.string.client_secret_site))
    15. .subscribeOn(Schedulers.io())
    16. .observeOn(AndroidSchedulers.mainThread())
    17. .subscribe(new Observer() {
    18. @Override
    19. public void onSubscribe(Disposable d) {
    20. }
    21. @Override
    22. public void onNext(TokenResponse tokenResponse) {
    23. if (tokenResponse != null) {
    24. if (tokenResponse.getAccess_token() != null) {
    25. // Log.e(TAG, tokenResponse.getBody().getAccess_token());
    26. Log.e(TAG, "token response" + tokenResponse.getAccess_token());
    27. SearchKitInstance.getInstance().setInstanceCredential(tokenResponse.getAccess_token());
    28. } else {
    29. Log.e(TAG, "get responseBody token is null");
    30. }
    31. } else {
    32. Log.e(TAG, "get responseBody is null");
    33. }
    34. }
    35. @Override
    36. public void onError(Throwable e) {
    37. Log.e(TAG, "get token error: " + e.getMessage());
    38. }
    39. @Override
    40. public void onComplete() {
    41. getSuggest(landamark_str);
    42. getSpellCheck(landamark_str);
    43. }
    44. });
    45. }
    46. private void getSuggest(final String query) {
    47. Observable.create (ObservableOnSubscribe>) emitter -> {
    48. AutoSuggestResponse response =
    49. SearchKitInstance.getInstance()
    50. .getSearchHelper()
    51. .suggest(query, Language.ENGLISH);
    52. List list = new ArrayList();
    53. if (response != null) {
    54. if (response.getSuggestions() != null && !response.getSuggestions().isEmpty()) {
    55. for (int i = 0; i < response.getSuggestions().size(); i++) {
    56. list.add(response.getSuggestions().get(i).getName());
    57. }
    58. emitter.onNext(list);
    59. }
    60. }
    61. emitter.onComplete();
    62. })
    63. .subscribeOn(Schedulers.newThread())
    64. .observeOn(AndroidSchedulers.mainThread())
    65. .subscribe(
    66. list -> doSearch(landamark_str),
    67. StaticUtils.consumer);
    68. }
    69. private void doSearch(String query) {
    70. webRequest.setQ(query);
    71. webRequest.setLang(Language.ENGLISH);
    72. webRequest.setSregion(Region.UNITEDKINGDOM);
    73. webRequest.setPn(1);
    74. webRequest.setPs(10);
    75. webRequest.setWithin("www.amazon.com");
    76. commonRequest.setQ(query);
    77. commonRequest.setLang(Language.ENGLISH);
    78. commonRequest.setSregion(Region.UNITEDKINGDOM);
    79. commonRequest.setPn(1);
    80. commonRequest.setPs(10);
    81. Observable.create(StaticUtils.observable)
    82. .subscribeOn(Schedulers.newThread())
    83. .observeOn(AndroidSchedulers.mainThread())
    84. .subscribe(
    85. baseSearchResponse -> {
    86. if (baseSearchResponse != null && baseSearchResponse.getData() != null) {
    87. setValue((List) baseSearchResponse.getData());
    88. }
    89. },
    90. StaticUtils.consumer);
    91. }

    效果:

    cke_1444109.png

    上图展示了Mughal Holidays附近的地点。

    13 集成全景服务

    Duration: 1:00

    通过集成全景服务SDK,您可以在Android手机上快速将球形展开的全景图片或柱状全景图片在模拟的三维空间中以可交互的方式展示,给用户带来沉浸感与真实感。

    1. 添加依赖。

      添加全景服务的依赖。

      1. dependencies {
      2. implementation "com.huawei.hms:panorama:"
      3. }

      说明:本示例中使用的全景服务SDK版本为6.0.0.302。

      您在开发时,请使用最新版本。点击此处获取最新版本。

    添加下述代码获取3D和全方位视角。

    1. Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    2. Panorama.getInstance().loadImageInfoWithPermission(
    3. this, getImageUri(this, bmp), PanoramaInterface.IMAGE_TYPE_SPHERICAL)
    4. .setResultCallback(new ResultCallbackImpl());
    5. private class ResultCallbackImpl implements ResultCallback {
    6. @Override
    7. public void onResult(PanoramaInterface.ImageInfoResult panoramaResult) {
    8. if (panoramaResult == null) {
    9. logAndToast("panoramaResult is null");
    10. return;
    11. }
    12. if (panoramaResult.getStatus().isSuccess()) {
    13. Intent intent = panoramaResult.getImageDisplayIntent();
    14. if (intent != null) {
    15. startActivity(intent);
    16. } else {
    17. logAndToast("unknown error, view intent is null");
    18. }
    19. } else {
    20. logAndToast("error status : " + panoramaResult.getStatus());
    21. }
    22. }
    23. }

    效果:

    cke_1575663.png

    如图所示,应用展示了全景视角。

    14 恭喜您

    祝贺您,您已成功构建本示例应用并学会了:

    在Android Studio中为您的应用集成多个HMS Core服务。

    16 参考

    参考如下文档获取更多信息:

    欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

  • 相关阅读:
    数据库管理-第104期 RAC上升级SSH的坑(20230918)
    hiredis/examples /example-libevent.c
    力扣(LeetCode)2578. 最小和分割(C++)
    【Chrony】一个多功能的NTP实现
    Facebook的数字社交使命:连接世界的下一步
    Dart HttpClient 网络请示框架的使用详解
    bazel构建项目案例(第三方库,编译成库,运行案例)
    携载PEG-PLA纳米粒子/F3O4磁性纳米粒子/银纳米团簇基/纳米二氧化钛改性壳聚糖水凝胶
    阿里云和AWS的对比研究一:AWS的起源
    光栅区域衍射级数和效率的规范
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/127750128