Android 缓慢的请求/响应-谷歌OCR API

Android 缓慢的请求/响应-谷歌OCR API,android,performance,request,ocr,google-vision,Android,Performance,Request,Ocr,Google Vision,我正在用Android Studio编写一个应用程序,使用谷歌的光学字符识别API 我基本上是直接从相机拍摄的图片中检索数据,以Base64和低分辨率对其进行编码(生成一个大小为300KB的字节数组) 我在线程中运行此代码,以便使用此base64编码的图像发出请求,但服务器返回的响应有点慢(大约9-10秒) 另外,根据谷歌控制台,我发出的请求平均延迟为1000毫秒 这是正常的还是我做错了什么?有没有办法减少延迟 if(getIntent().getBooleanExtra("requestDat

我正在用Android Studio编写一个应用程序,使用谷歌的光学字符识别API

我基本上是直接从相机拍摄的图片中检索数据,以Base64和低分辨率对其进行编码(生成一个大小为300KB的字节数组)

我在线程中运行此代码,以便使用此base64编码的图像发出请求,但服务器返回的响应有点慢(大约9-10秒)

另外,根据谷歌控制台,我发出的请求平均延迟为1000毫秒

这是正常的还是我做错了什么?有没有办法减少延迟

if(getIntent().getBooleanExtra("requestDataToAPI",false)){ // Scan effectué
        String[] photoBase64 = {getIntent().getStringExtra("photoBase64")};
        LoadDataFromImage task = new LoadDataFromImage(this);
        task.execute(photoBase64);
    }

处理请求的线程:

private class LoadDataFromImage extends AsyncTask<String, Integer, String> {
    private Context ctx;

    public LoadDataFromImage (Context context){
        ctx = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mDialog = new ProgressDialog(ctx);
        mDialog.setMessage("Analyse de la photo ...");
        mDialog.setCancelable(false);
        mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mDialog.show();
    }

    @Override
    protected String doInBackground(String... photoBase64) {
        Vision.Builder visionBuilder = new Vision.Builder( new NetHttpTransport(), new AndroidJsonFactory(), null);
        String cleAPI = getString(R.string.google_vision_ocr_api_key); // CLE PRIVEE ---> vous DEVEZ vous procurer votre propre clé avec Google
        visionBuilder.setVisionRequestInitializer(new VisionRequestInitializer(cleAPI));
        vision = visionBuilder.build();

        // Type d'analyse d'image
        Feature desiredFeature = new Feature();
        desiredFeature.setType("TEXT_DETECTION");

        Image inputImage = new Image();
        inputImage.encodeContent(com.google.api.client.util.Base64.decodeBase64(photoBase64[0]));
        AnnotateImageRequest request = new AnnotateImageRequest();
        request.setImage(inputImage);
        request.setFeatures(Arrays.asList(desiredFeature));

        BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest();
        batchRequest.setRequests(Arrays.asList(request));

        // Réponse du serveur
        BatchAnnotateImagesResponse batchResponse = new BatchAnnotateImagesResponse();
        try {
            batchResponse = vision.images().annotate(batchRequest).execute();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), "Impossible d'accéder à la reconnaissance de textes", Toast.LENGTH_LONG).show();
            Log.d("API Run :", e.toString());
        }

        final TextAnnotation text = batchResponse.getResponses().get(0).getFullTextAnnotation();
        if(text != null){
            String textReceived = text.getText();
            System.out.println(textReceived);
            return textReceived;
        }
        else{
            return null;
        }

    }

    protected void onProgressUpdate(Integer... progress) {
        mDialog.setProgress(progress[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        mDialog.dismiss();
        addName.setText(result);
        Toast.makeText(getApplicationContext(), "Facture transférée", Toast.LENGTH_SHORT).show();
    }

}
私有类LoadDataFromImage扩展异步任务{
私有上下文ctx;
公共LoadDataFromImage(上下文){
ctx=上下文;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
mDialog=新进度对话框(ctx);
mDialog.setMessage(“分析照片…”);
mDialog.setCancelable(假);
mDialog.setProgressStyle(ProgressDialog.STYLE_微调器);
mDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…photoBase64){
Vision.Builder visionBuilder=new Vision.Builder(new NetHttpTransport(),new AndroidJsonFactory(),null);
String cleAPI=getString(R.String.google_vision_ocr_api_key);//CLE PRIVEE-->vous DEVEZ vous procurer votre propre cléavec google
setVisionRequestInitializer(新的VisionRequestInitializer(CLEPI));
vision=visionBuilder.build();
//d型分析d型图像
特征desiredFeature=新特征();
desiredFeature.setType(“文本检测”);
图像输入图像=新图像();
inputImage.encodeContent(com.google.api.client.util.Base64.decodeBase64(photoBase64[0]);
AnnotateImageRequest=新建AnnotateImageRequest();
request.setImage(inputImage);
request.setFeatures(Arrays.asList(desiredFeature));
BatchAnnotateImagesRequest batchRequest=新的BatchAnnotateImagesRequest();
setRequests(Arrays.asList(request));
//服务提供商
BatchAnnotateImagesResponse batchResponse=新的BatchAnnotateImagesResponse();
试一试{
batchResponse=vision.images().annotate(batchRequest.execute();
}捕获(IOE异常){
Toast.makeText(getApplicationContext(),“不可能的文本侦察”,Toast.LENGTH_LONG.show();
d(“API运行:,例如toString());
}
final TextAnnotation text=batchResponse.getResponses().get(0.getFullTextAnnotation();
如果(文本!=null){
字符串textReceived=text.getText();
System.out.println(textReceived);
收到返回文本;
}
否则{
返回null;
}
}
受保护的void onProgressUpdate(整数…进度){
mDialog.setProgress(progress[0]);
}
@凌驾
受保护的void onPostExecute(字符串结果){
mDialog.discouse();
addName.setText(结果);
Toast.makeText(getApplicationContext(),“Facture transférée”,Toast.LENGTH_SHORT).show();
}
}

如果您可以首先将图像上传到谷歌存储而不是内部存储/sd卡,我相信这是最好的方法,既简单又高效。请务必在您尝试后对此问题发表评论!我们真的很欣赏听到真实世界的经历。