Android 缓慢的请求/响应-谷歌OCR API
我正在用Android Studio编写一个应用程序,使用谷歌的光学字符识别API 我基本上是直接从相机拍摄的图片中检索数据,以Base64和低分辨率对其进行编码(生成一个大小为300KB的字节数组) 我在线程中运行此代码,以便使用此base64编码的图像发出请求,但服务器返回的响应有点慢(大约9-10秒) 另外,根据谷歌控制台,我发出的请求平均延迟为1000毫秒 这是正常的还是我做错了什么?有没有办法减少延迟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
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卡,我相信这是最好的方法,既简单又高效。请务必在您尝试后对此问题发表评论!我们真的很欣赏听到真实世界的经历。