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文件所要求的所有更改的概述。