14

Я только настройка меню быстрого старта Google диск приложений SDK для Android доступны на this ссылкеGoogle Drive SDK для OCR

Я пытаюсь загрузить изображения, а затем сделать OCR на них. Пример приложения на Android QuickStart работает отлично, но когда я пытаюсь установить логическое значение для распознавания текста, как верно я получаю следующее 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

Это может быть поврежденное изображение, чтобы получить ошибку http 400. –

+0

У меня такая же проблема. Может быть, из-за типа мим? Поскольку документ на диске будет иметь как изображение, так и текст? – AndroidDev93

+0

вы можете попробовать с помощью приложения/vnd.google-apps.photo, как указано в https://developers.google.com/drive/mime-types. – nsL

ответ

2

Я только что закончил делать это Google Drive Пример Quickstart из документации. Код устарел и даже не скомпилировался. После этого у меня возникли другие проблемы при запуске приложения на устройстве.

Я перечислил изменения, необходимые для обеспечения этой работы и передачи на следующий проект github. Это проект Eclipse ADT, поэтому не стесняйтесь проверять и сравнивать с вашим кодом. Я тестировал с включенной опцией OCR и проверял результат.

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

Файл ридми есть обзор всех необходимых изменений.

Смежные вопросы