2014-01-11 51 views
0

我試圖上傳一個文件到我的GoogleDrive,但是我得到了一個IOException異常,我找不到原因了?怎麼了 ?應該修改什麼? 證書,文件路徑,文件名,文件類型(text/csv)是正確的... parent_id folderID很好... 和顯然我測試過,如果連接到互聯網......但沒辦法,我總是得到這個IOException線:文件= insert.execute()(我執行的調試器中運行...)Android GoogleDrive insert.execute()引發IOException - 如何獲得關於錯誤的更多信息?

 private File uploadFile(boolean useDirectUpload) throws IOException { 
     java.io.File fileContent = new java.io.File(mFileUri.getPath()); 

     com.google.api.services.drive.model.File fileMetadata = new File(); 
     fileMetadata.setParents(Arrays.asList(new ParentReference().setId(mFolderId))); 
     fileMetadata.setTitle(fileContent.getName()); 
     InputStreamContent mediaContent = new InputStreamContent("text/csv", new BufferedInputStream(new FileInputStream(fileContent))); 
     mediaContent.setLength(fileContent.length()); 

     Drive.Files.Insert insert = mService.files().insert(fileMetadata, mediaContent); 
     MediaHttpUploader uploader = insert.getMediaHttpUploader(); 
     uploader.setDirectUploadEnabled(useDirectUpload); 
     uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE); 
     uploader.setProgressListener(new FileUploadProgressListener()); 
     File file = insert.execute(); 
     //return insert.execute(); 
     return file; 
    } 
+0

我現在可以獲取堆棧跟蹤,添加Log.e(TAG,Log.getStackTraceString(e));然而,經常出現這樣的錯誤:{「code」:404,「errors」:[{「domain」:「global」,「message」:「File not found:」,「reason」:「notFound」}]消息「:」文件未找到:「}不提供信息AT ALL ... Google API文檔:建議採取的措施:向用戶報告他們沒有對文件的讀取權限或文件不存在。告訴他們他們應該請求所有者許可文件。 ...哪個文件?我正在上傳的現有文件夾還是現有的父文件夾? – erwin

回答

1

中的parentID 'mFolderID' 爲空。(這是給意義消息WO任何ID ..) 我修改我的設計...先前使用2個線程與WeakReference ...一個用於獲取folderID(並設置私有靜態字符串mFolderId)和另一個用於上傳(使用mFolderID)...但使用WeakReference,mFolderId被設置爲null for這個新線程

我現在只使用一個線程,以獲得folderID並上傳在它的文件...

private void uploadFileInSwinglogFolder() { 
    mUploadFileInSwinglogFolderThread = new UploadFileInSwinglogFolderThread(UploadActivity.this); 
    mUploadFileInSwinglogFolderThread.start();  
} 

// static inner classes don't hold implicit references to their 
// enclosing class, so the Activity instance won't be leaked across configuration change  
private static class UploadFileInSwinglogFolderThread extends Thread { 
    private final WeakReference<UploadActivity> mActivity; 

    public UploadFileInSwinglogFolderThread(UploadActivity activity) { 
     mActivity = new WeakReference<UploadActivity>(activity); 
    } 

    private boolean mRunning = false; 
    @Override 
    public void run() { 
     UploadActivity activity = mActivity.get(); 
     mRunning = true; 
     while (mRunning) { 
      mResultList = new ArrayList<File>(); 
      mIOException = false; 
      mFolderId = null; 
      Files f1 = mService.files(); 
      Files.List request = null; 
       try { 
        request = f1.list(); 
        // searching for named folder at root level 
        String aQuery = "'root' in parents and mimeType='application/vnd.google-apps.folder' and title='"+ mFolderName + "'"; 
        request.setQ(aQuery);      
        FileList fileList = request.execute(); 
        mResultList.addAll(fileList.getItems()); 
        request.setPageToken(fileList.getNextPageToken()); 
       } catch (UserRecoverableAuthIOException e) { 
        activity.startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
       } catch (IOException e) { 
        Log.e(TAG, "STACKTRACE"); 
        Log.e(TAG, Log.getStackTraceString(e)); 
        mIOException = true; 
        Message msg = activity.mHandler.obtainMessage(); 
        Bundle bundle = new Bundle(); 
        bundle.putInt("msgKey", UploadActivity.IO_EXCEPTION); 
        msg.setData(bundle); 
        activity.mHandler.sendMessage(msg); 
       } finally { 
        if (mResultList.size() == 0) { 
         Message msg = activity.mHandler.obtainMessage(); 
         Bundle bundle = new Bundle(); 
         bundle.putInt("msgKey", UploadActivity.NO_SWIMLOGS_FOLDER); 
         msg.setData(bundle); 
         activity.mHandler.sendMessage(msg); 
        } else { 
         // Got the parent folderID in googleDrive 
         mFolderId = mResultList.get(0).getId(); 
         File file = null; 
         try { 
          java.io.File fileContent = new java.io.File(mFileUri.getPath()); 
          //FileContent mediaContent = new FileContent("text/csv", fileContent); 
          InputStreamContent mediaContent = new InputStreamContent("text/csv", new BufferedInputStream(new FileInputStream(fileContent))); 
          mediaContent.setLength(fileContent.length()); 

          File body = new File(); 
          body.setTitle(fileContent.getName());     
          body.setMimeType("text/csv"); 
          Log.d(TAG, "mFolderID: " + mFolderId); 
          body.setParents(Arrays.asList(new ParentReference().setId(mFolderId))); 

          Drive.Files.Insert insert = mService.files().insert(body, mediaContent); 

          MediaHttpUploader uploader = insert.getMediaHttpUploader(); 
          uploader.setDirectUploadEnabled(false); 
          uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE); 

// TODO設置過程偵聽//uploader.setProgressListener(new FileUploadProgressListener());

      file = insert.execute();         
         } catch (IOException e) { 
          Log.d(TAG, "IOException in uploading file code: "); 
          Log.e(TAG, "STACKTRACE"); 
          Log.e(TAG, Log.getStackTraceString(e)); 
          Message msg = activity.mHandler.obtainMessage(); 
          Bundle bundle = new Bundle(); 
          bundle.putInt("msgKey", UploadActivity.IO_EXCEPTION); 
          msg.setData(bundle); 
          activity.mHandler.sendMessage(msg); 
         } finally { 
          Log.d(TAG, "end try - finally block "); 
          if (file != null) { 
           Log.d(TAG, "Uploading file done: " + file.getTitle()); 
           Log.d(TAG, "UploadActivity - thread - file uploaded"); 
           Message msg = activity.mHandler.obtainMessage(); 
           Bundle bundle = new Bundle(); 
           bundle.putInt("msgKey", UploadActivity.SWIMLOG_UPLOADED); 
           msg.setData(bundle); 
           activity.mHandler.sendMessage(msg);         
          } 
         } 
        } 
        mRunning = false; 
       } 
     } 
    } 
    public void close() { 
     mRunning = false; 
    } 
} 
相關問題