14

Tôi vừa thiết lập QuickStart google ổ sdk ứng dụng dành cho Android có sẵn trên this liên kếtGoogle Drive SDK cho OCR

Tôi cố gắng để tải lên hình ảnh và sau đó làm OCR trên chúng. Việc áp dụng mẫu trên quickstart Android hoạt động tốt, nhưng khi tôi cố gắng đặt boolean cho OCR là đúng tôi nhận được IOException sau:

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): } 

Điều thú vị là tôi đã có thể thực hiện OCR khoảng 2 lần và sau đó tôi có thể đã sửa đổi nguồn hoặc một cái gì đó và bây giờ nó không hoạt động. Nhưng tôi nhớ sự thay đổi duy nhất tôi bị buộc phải từ ứng dụng quickstart được thay đổi dòng này: File file = service.files().insert(body, mediaContent).execute(); như sau:

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

Đây là mã của tôi:

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

Nó có thể là một đốm màu hình ảnh bị lỗi để nhận lỗi http 400. –

+0

Tôi gặp vấn đề tương tự. Nó có thể là do loại mime? Kể từ khi tài liệu ổ đĩa sẽ có cả hình ảnh và văn bản? – AndroidDev93

+0

bạn có thể thử với ứng dụng/vnd.google-apps.photo, như đã nói trong https://developers.google.com/drive/mime-types – nsL

Trả lời

2

Tôi chỉ làm cho Google Drive này xong Ví dụ Quickstart từ công việc tài liệu. Mã đã lỗi thời và thậm chí không biên dịch lúc đầu. Sau khi thành công, tôi đã gặp một số vấn đề khác khi chạy ứng dụng trên thiết bị.

Tôi đã liệt kê các thay đổi cần thiết để làm việc này và cam kết với dự án github sau đây. Đây là một dự án ADT của Eclipse, vì vậy hãy kiểm tra và so sánh với mã của bạn. Tôi đã thử nghiệm với tùy chọn OCR được bật và xác minh kết quả.

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

Tệp readme có tổng quan về tất cả các thay đổi cần thiết.

Các vấn đề liên quan