14

我刚刚安装的Android快速入门谷歌驱动SDK应用程序可在this链接谷歌驱动器的SDK OCR

我想上传图片,然后做OCR他们。在Android快速入门的示例应用程序工作正常,但是当我尝试设置为OCR布尔为真,我得到以下IOException异常:

07-29 03:33:01.172: D/OCR_SERVICE(22602): Error 2: 400 Bad Request 
07-29 03:33:01.172: D/OCR_SERVICE(22602): { 
07-29 03:33:01.172: D/OCR_SERVICE(22602): "code": 400, 
07-29 03:33:01.172: D/OCR_SERVICE(22602): "errors": [ 
07-29 03:33:01.172: D/OCR_SERVICE(22602):  { 
07-29 03:33:01.172: D/OCR_SERVICE(22602):  "domain": "global", 
07-29 03:33:01.172: D/OCR_SERVICE(22602):  "message": "Bad Request", 
07-29 03:33:01.172: D/OCR_SERVICE(22602):  "reason": "badRequest" 
07-29 03:33:01.172: D/OCR_SERVICE(22602):  } 
07-29 03:33:01.172: D/OCR_SERVICE(22602): ], 
07-29 03:33:01.172: D/OCR_SERVICE(22602): "message": "Bad Request" 
07-29 03:33:01.172: D/OCR_SERVICE(22602): } 

有趣的是,我能够做的OCR约2倍,那么在那之后,我可能会修改源代码或其他东西,现在它不起作用。不过,我记得我唯一的变化,从快速启动应用程序使正在改变这一行:File file = service.files().insert(body, mediaContent).execute();以下几点:

File file = service.files().insert(body, mediaContent).setOcr(true).execute(); 

这里是我的代码:

public class MainActivity extends Activity { 
    static final int REQUEST_ACCOUNT_PICKER = 1; 
    static final int REQUEST_AUTHORIZATION = 2; 
    static final int CAPTURE_IMAGE = 3; 

    private static Uri fileUri; 
    private static Drive service; 
    private GoogleAccountCredential credential; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    credential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE); 
    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER); 
    } 

    @Override 
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    switch (requestCode) { 
    case REQUEST_ACCOUNT_PICKER: 
     if (resultCode == RESULT_OK && data != null && data.getExtras() != null) { 
     String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
     if (accountName != null) { 
      credential.setSelectedAccountName(accountName); 
      service = getDriveService(credential); 
      startCameraIntent(); 
     } 
     } 
     break; 
    case REQUEST_AUTHORIZATION: 
     if (resultCode == Activity.RESULT_OK) { 
     saveFileToDrive(); 
     } else { 
     startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER); 
     } 
     break; 
    case CAPTURE_IMAGE: 
     if (resultCode == Activity.RESULT_OK) { 
     saveFileToDrive(); 
     } 
    } 
    } 

    private void startCameraIntent() { 
    String mediaStorageDir = Environment.getExternalStoragePublicDirectory(
     Environment.DIRECTORY_PICTURES).getPath(); 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()); 
    fileUri = Uri.fromFile(new java.io.File(mediaStorageDir + java.io.File.separator + "IMG_" 
     + timeStamp + ".jpg")); 

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(cameraIntent, CAPTURE_IMAGE); 
    } 

    private void saveFileToDrive() { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     try { 
      // File's binary content 
      java.io.File fileContent = new java.io.File(fileUri.getPath()); 
      FileContent mediaContent = new FileContent("image/jpeg", fileContent); 

      // File's metadata. 
      File body = new File(); 
      body.setTitle(fileContent.getName()); 
      body.setMimeType("image/jpeg"); 

      File file = service.files().insert(body, mediaContent).setOcr(true).execute(); 
      if (file != null) { 
      showToast("Photo uploaded: " + file.getTitle()); 
      startCameraIntent(); 
      } 
     } catch (UserRecoverableAuthIOException e) { 
      Log.d("OCR_SERVICE", "Error 1: " + e.getMessage()); 
      startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
     } catch (IOException e) { 
      Log.d("OCR_SERVICE", "Error 2: " + e.getMessage()); 
      e.printStackTrace(); 
     } 
     } 
    }); 
    t.start(); 
    } 

    private Drive getDriveService(GoogleAccountCredential credential) { 
    return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential) 
     .build(); 
    } 

    public void showToast(final String toast) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    } 
} 
+0

它可能是一个损坏的图像blob接收http 400错误。 –

+0

我有完全相同的问题。这可能是因为mime类型吗?由于驱动器文档会同时具有图像和文本? – AndroidDev93

+0

您可以尝试使用application/vnd.google-apps.photo,如https://developers.google.com/drive/mime-types中所述 – nsL

回答

2

我刚拍完这个谷歌驱动器文档工作中的快速入门示例。代码已经过时,甚至没有编译起初。一旦成功,我在设备上运行应用程序时遇到了一些其他问题。

我已经列出了所需的更改,以使其工作并致力于以下github项目。这是一个Eclipse ADT项目,请随时查看并与您的代码进行比较。我已经测试了启用OCR选项并验证了结果。

https://github.com/hanscappelle/more-android-examples/tree/master/DriveQuickstart

README文件所要求的所有更改的概述。