乐趣区

关于hms-core:一文搞懂华为ML-Kit拍照购超简单集成

简介

华为 HMS ML Kit 提供拍照购服务,用户通过拍摄商品图片,在事后建设的商品图片库中在线检索同款或类似商品,返回类似商品 ID 和相干信息。

利用场景

  1. 应用摄像头设施从开发的购物 APP 当中捕获产品图像。
  1. 在循环视图当中显示返还的产品列表。

开发筹备

  1. 举荐应用 Java JDK 1.8 或者更高版本。
  1. 举荐应用 Android Studio。
  1. 搭载 HMS Core4.0.0.300 或者更高版本的华为安卓设施。
  1. 在开发 APP 之前,你须要注册华为开发者,账号注册。
  1. 集成 AppGallery Connect SDK, 请拜访 AppGallery Connect 服务入门指南。

开发

  1. 在 Manage APIs 中启用 ML Kit, 可参考开明服务。
  1. 在 app-level bulid.gradle 中集成以下依赖项。
// Import the product visual search SDK.



 implementation 'com.huawei.hms:ml-computer-vision-cloud:2.0.1.300'
  1. 在 app.gradle 文件的顶部增加 agc 插件。
apply plugin: 'com.huawei.agconnect'
  1. 在清单中增加以下权限。
  • 摄像头权限 android.permission.CAMERA: 从摄像头中获取实时图像或视频。
  • 网络连接权限 android.permission.INTERNET:拜访互联网上的云服务。
  • 存储写权限 android.permission.WRITE_EXTERNAL_STORAGE: 降级算法版本。
  • 存储读权限 android.permission.READ_EXTERNAL_STORAGE: 读取存储在设施上的照片。
  1. 实时申请相机权限
private void requestCameraPermission() {final String[] permissions = new String[] {Manifest.permission.CAMERA};
 
     if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {ActivityCompat.requestPermissions(this, permissions, this.CAMERA_PERMISSION_CODE);
         return;
     }
 }
  1. 在 Application class 中增加以下代码
public class MyApplication extends Application {
 
@Override
     public void onCreate() {super.onCreate();
         MLApplication.getInstance().setApiKey("API KEY");
     }
 }

能够从 AGC 或者集成的 agconnect-services.json 取得 API key。

  1. 为拍照购物创立一个分析器。
private void initializeProductVisionSearch() {MLRemoteProductVisionSearchAnalyzerSetting settings = new MLRemoteProductVisionSearchAnalyzerSetting.Factory()
 // Set the maximum number of products that can be returned.
                 .setLargestNumOfReturns(16)
                 // Set the product set ID. (Contact mlkit@huawei.com to obtain the configuration guide.)
 //                .setProductSetId(productSetId)
                 // Set the region.
                 .setRegion(MLRemoteProductVisionSearchAnalyzerSetting.REGION_DR_CHINA)
                 .create();
          analyzer
                 = MLAnalyzerFactory.getInstance().getRemoteProductVisionSearchAnalyzer(settings);
     }
  1. 从相机中捕获图像。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 
 startActivityForResult(intent, REQ_CAMERA_CODE);
  1. 一旦图像被捕获,将执行 onActivityResult() method。
@Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);
         Log.d(TAG, "onActivityResult");
         if(requestCode == 101) {if (resultCode == RESULT_OK) {Bitmap bitmap = (Bitmap) data.getExtras().get("data");
                 if (bitmap != null) {
 // Create an MLFrame object using the bitmap, which is the image data in bitmap format.
                     MLFrame mlFrame = new MLFrame.Creator().setBitmap(bitmap).create();
                     mlImageDetection(mlFrame);
                 }
  }
 
 }
     }  
     private void mlImageDetection(MLFrame mlFrame) {Task> task = analyzer.asyncAnalyseFrame(mlFrame);
     task.addOnSuccessListener(new OnSuccessListener>() {public void onSuccess(List products) {
             // Processing logic for detection success.
      displaySuccess(products);
             
   }})
             .addOnFailureListener(new OnFailureListener() {public void onFailure(Exception e) {
                     // Processing logic for detection failure.
                     // Recognition failure.
                     try {MLException mlException = (MLException)e;
                         // Obtain the result code. You can process the result code and customize respective messages displayed to users.
                         int errorCode = mlException.getErrCode();
                         // Obtain the error information. You can quickly locate the fault based on the result code.
                         String errorMessage = mlException.getMessage();} catch (Exception error) {// Handle the conversion error.}
                 }
             });
              } 
 
   private void displaySuccess(List productVisionSearchList) {List productImageList = new ArrayList();
         String prodcutType = "";
         for (MLProductVisionSearch productVisionSearch : productVisionSearchList) {Log.d(TAG, "type:" + productVisionSearch.getType() );
             prodcutType =  productVisionSearch.getType();
             for (MLVisionSearchProduct product : productVisionSearch.getProductList()) {productImageList.addAll(product.getImageList());
                 Log.d(TAG, "custom content:" + product.getCustomContent() );
             }
         }
         StringBuffer buffer = new StringBuffer();
         for (MLVisionSearchProductImage productImage : productImageList) {String str = "ProductID:" + productImage.getProductId() + "ImageID:" + productImage.getImageId() + "Possibility:" + productImage.getPossibility();
             buffer.append(str);
             buffer.append("
");
         }
         Log.d(TAG , "display success:" + buffer.toString());
         FragmentTransaction transaction = getFragmentManager().beginTransaction();
         transaction.replace(R.id.main_fragment_container, new SearchResultFragment(productImageList, prodcutType));
         transaction.commit();}

onSuccess() 回调将给咱们 MLProductVisionSearch.getType() 对象列表,可用于获取每个产品的 ID 和图像 URL。咱们还能够应用 productVisionSearch.getType() 获取产品类型,gatType() 返回可映射的编号。

在撰写本文时,产品类型是:

  1. 咱们能够应用以下代码实现产品类型映射。
private String getProductType(String type) {switch(type) {
        case "0":
            return "Others";
        case "1":
            return "Clothing";
        case "2":
            return "Shoes";
        case "3":
            return "Bags";
        case "4":
            return "Digital & Home appliances";
        case "5":
            return "Household Products";
        case "6":
            return "Toys";
        case "7":
            return "Cosmetics";
        case "8":
            return "Accessories";
        case "9":
            return "Food";
    }
    return  "Others";
}
  1. 从 MLVisionSearchProductImage 获取产品 ID 和图像 URL。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {final MLVisionSearchProductImage mlProductVisionSearch = productVisionSearchList.get(position);
 
    holder.tvTitle.setText(mlProductVisionSearch.getProductId());
    Glide.with(context)
            .load(mlProductVisionSearch.getImageId())
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imageView);
 
}

Demo


欲了解更多详情,请参阅:

华为开发者联盟官网

获取开发领导文档

参加开发者探讨请到 Reddit 社区

下载 demo 和示例代码请到 Github

解决集成问题请到 Stack Overflow


原文链接:
https://developer.huawei.com/consumer/cn/forum/topic/0201434135672410084?fid=18

作者:胡椒

退出移动版