2012-09-26 30 views
6

我必須實現將文件上傳到Google雲端硬盤的功能。
如在Quick Start指南。如何將GoogleAuthorizationCodeFlow與AccessType配合使用處於離線狀態

首先,我調用generateLinkAuth來生成鏈接來獲取代碼。
然後執行generateCode來獲取令牌。
一切都很好。

List<String> SCOPES = Arrays.asList("https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/userinfo.email", 
      "https://www.googleapis.com/auth/userinfo.profile", DriveScopes.DRIVE); 
    public String generateLinkAuth() { 
      mHttpTransport = new NetHttpTransport(); 
      mJsonFactory = new JacksonFactory(); 

      mFlow = new GoogleAuthorizationCodeFlow.Builder(mHttpTransport, mJsonFactory, CLIENT_ID, CLIENT_SECRET, SCOPES).setAccessType("online").setApprovalPrompt("force").build(); 


      String url = mFlow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 

      System.out.println("url :" + url); 
      return url; 
     } 

     public void generateCode(String code) { 
      new GetCredentialFromCode(mContext, code).execute(); 
     } 


     class GetCredentialFromCode extends AsyncTask<Void, Void, Void> { 
      private Context mContext; 
      private String code; 
      private final ProgressDialog mDialog; 

      public GetCredentialFromCode(Context context, String cd) { 
       mContext = context; 
       mDialog = new ProgressDialog(context); 
       mDialog.show(); 
       mDialog.setTitle("Uploading ..."); 
       code = cd; 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 

       if (mFlow != null) { 
        try { 

         mResponse = mFlow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 

         mCredential = new GoogleCredential(); 

         mCredential.setFromTokenResponse(mResponse); 


         String accessToken = mCredential.getAccessToken(); 
         Editor edit = mPrefs.edit(); 
         edit.putString(GOOGLE_DRIVE_TOKEN, accessToken); 
         edit.commit(); 

         String accessTokenSave = mPrefs.getString(GOOGLE_DRIVE_TOKEN, "NO KEY"); 
         Log.e(TAG, "access Token Saved is " + accessTokenSave); 

        } catch (IOException e) { 
         Editor edit = mPrefs.edit(); 
         edit.putString(GOOGLE_DRIVE_TOKEN, "NO KEY"); 
         e.printStackTrace(); 
        } 
       } 

       String accessTokenSave = mPrefs.getString(GOOGLE_DRIVE_TOKEN, "NO KEY"); 

       mHttpTransport = new NetHttpTransport(); 
       mJsonFactory = new JacksonFactory(); 
       mCredential = new GoogleCredential().setAccessToken(accessTokenSave); 

       getUserInfo(); 

       mDriveService = new Drive.Builder(mHttpTransport, mJsonFactory, mCredential).build(); 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       mDialog.dismiss(); 
       GoogleDriveLogInAct act= (GoogleDriveLogInAct) mContext; 
       act.goBackSettingScreen(); 
      } 

     } 

的問題是,令牌將在1小時內到期,setAccessType(「在線」),所以我將其更改爲setAccessType(「離線」)。
當我改變它,並再次運行我的Android應用程序時,我得到一個錯誤 - 當我執行下面的代碼。

   mResponse = mFlow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 

       mCredential = new GoogleCredential(); 

       mCredential.setFromTokenResponse(mResponse); 

當我嘗試調試在控制檯上執行mCredential.setFromTokenResponse(mResponse)。,會引發異常

java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:278) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.IllegalArgumentException: Please use the Builder and call setJsonFactory, setTransport and setClientSecrets 
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setRefreshToken(GoogleCredential.java:294) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setRefreshToken(GoogleCredential.java:153) 
    at com.google.api.client.auth.oauth2.Credential.setFromTokenResponse(Credential.java:556) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setFromTokenResponse(GoogleCredential.java:313) 
    at com.jp.shotdocs.libs.GoogleDriveLib$GetCredentialFromCode.doInBackground(GoogleDriveLib.java:168) 
    at com.jp.shotdocs.libs.GoogleDriveLib$GetCredentialFromCode.doInBackground(GoogleDriveLib.java:1) 
    at android.os.AsyncTask$2.call(AsyncTask.java:264) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    ... 4 more 

如何使用accessType離線?
有什麼我必須修改使用此模式?

+1

我已經解決了這個問題...我應該使用GoogleCredential.Build()而不是新的GoogleCredential()聲明GoogleCredential。 – quantm

+1

請發表一篇評論,而不是評論,否則問題仍然存在未答覆部分 – rds

+0

以我的理解,請檢查我是否正確。 – Bharathi

回答

相關問題