一文搞懂华为ML Kit拍照购,超简单集成

简介

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


应用场景

1. 使用摄像头设备从开发的购物APP当中捕捉产品图像。

2. 在循环视图当中显示返还的产品列表。


开发准备

1. 推荐使用Java JDK 1.8或者更高版本。

2. 推荐使用Android Studio。

3. 搭载HMS Core4.0.0.300 或者更高版本的华为安卓设备。

4. 在开发APP之前,你需要注册华为开发者,账号注册

5. 集成AppGallery Connect SDK, 请访问AppGalleryConnect服务入门指南

开发

1. 在Manage APIs中启用ML Kit, 可参考开通服务

2.  在app-level bulid.gradle 中集成以下依赖项。

// Importthe product visual search SDK.

 implementation'com.huawei.hms:ml-computer-vision-cloud:2.0.1.300'

3. 在app.gradle文件的顶部添加agc插件。

applyplugin: 'com.huawei.agconnect'

4. 在清单中添加以下权限。

摄像头权限android.permission.CAMERA:从摄像头中获取实时图像或视频。

网络连接权限android.permission.INTERNET:访问互联网上的云服务。

存储写权限android.permission.WRITE_EXTERNAL_STORAGE:升级算法版本。

存储读权限android.permission.READ_EXTERNAL_STORAGE:读取存储在设备上的照片。

5.  实时请求相机权限

privatevoid 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;

     }

 }

6. 在Application class 中添加以下代码

publicclass MyApplication extends Application {


     @Override

     public void onCreate() {

         super.onCreate();

        MLApplication.getInstance().setApiKey("API KEY");

     }

 }

可以从AGC或者集成的agconnect-services.json获得API key。

7. 为拍照购物创建一个分析器。

privatevoid initializeProductVisionSearch() {

        MLRemoteProductVisionSearchAnalyzerSetting settings = newMLRemoteProductVisionSearchAnalyzerSetting.Factory()

 // Set the maximum number of products that canbe 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);

     }

8. 从相机中捕捉图像。

Intentintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);


 startActivityForResult(intent,REQ_CAMERA_CODE);

9. 一旦图像被捕捉,将执行onActivityResult() method。

@Override

     public void onActivityResult(intrequestCode, 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 = newMLFrame.Creator().setBitmap(bitmap).create();

                     mlImageDetection(mlFrame);

                 }


             }


         }

     } 


privatevoid mlImageDetection(MLFrame mlFrame) {

     Task> task =analyzer.asyncAnalyseFrame(mlFrame);

     task.addOnSuccessListener(newOnSuccessListener>() {

         public void onSuccess(List products) {

             // Processing logic for detectionsuccess.


             displaySuccess(products);


         }})

             .addOnFailureListener(newOnFailureListener() {

                 public voidonFailure(Exception e) {

                     // Processing logic fordetection failure.

                     // Recognition failure.

                     try {

                         MLExceptionmlException = (MLException)e;

                         // Obtain the resultcode. You can process the result code and customize respective messagesdisplayed to users.

                         int errorCode =mlException.getErrCode();

                         // Obtain the errorinformation. You can quickly locate the fault based on the result code.

                         String errorMessage =mlException.getMessage();

                     } catch (Exception error){

                         // Handle theconversion error.

                     }

                 }

             });

 }



    private void displaySuccess(ListproductVisionSearchList) {

         List productImageList = newArrayList();

         String prodcutType = "";

         for (MLProductVisionSearchproductVisionSearch : productVisionSearchList) {

             Log.d(TAG, "type: " +productVisionSearch.getType() );

             prodcutType =  productVisionSearch.getType();

             for (MLVisionSearchProduct product: productVisionSearch.getProductList()) {

                productImageList.addAll(product.getImageList());

                 Log.d(TAG, "customcontent: " + product.getCustomContent() );

             }

         }

         StringBuffer buffer = newStringBuffer();

         for (MLVisionSearchProductImageproductImage : 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, newSearchResultFragment(productImageList, prodcutType ));

         transaction.commit();

     }

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


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


10. 我们可以使用以下代码实现产品类型映射。

privateString 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 & Homeappliances";

        case "5":

            return "HouseholdProducts";

        case "6":

            return "Toys";

        case "7":

            return "Cosmetics";

        case "8":

            return "Accessories";

        case "9":

            return "Food";

    }

    return "Others";

}

11. 从MLVisionSearchProductImage获取产品ID和图像URL。

@Override

publicvoid onBindViewHolder(ViewHolder holder, int position) {

    final MLVisionSearchProductImagemlProductVisionSearch = productVisionSearchList.get(position);


   holder.tvTitle.setText(mlProductVisionSearch.getProductId());

    Glide.with(context)

           .load(mlProductVisionSearch.getImageId())

                   .diskCacheStrategy(DiskCacheStrategy.ALL)

                    .into(holder.imageView);


}


Demo


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

华为开发者联盟官网:https://developer.huawei.com/consumer/cn/hms

获取开发指导文档:https://developer.huawei.com/consumer/cn/doc/development

参与开发者讨论请到Reddit社区:https://www.reddit.com/r/HMSCore/

下载demo和示例代码请到Github:https://github.com/HMS-Core

解决集成问题请到Stack

Overflow:https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容