2012-09-26 1 views
6

Muszę zaimplementować funkcję przesyłania pliku na Dysk Google.
Podobnie jak w przypadku Quick Start przewodnik.Sposób korzystania z GoogleAuthorizationCodeFlow z AccessType jest offline

Najpierw wywołuję generateLinkAuth w celu wygenerowania linku, aby uzyskać kod.
Następnie generowany będzie kod, aby uzyskać token.
Wszystko w porządku.

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(); 
      } 

     } 

Problemem jest to, że token wygaśnie w ciągu 1 godziny z setAccessType ("online"), więc mogę zmienić go setAccessType ("offline").
Po zmianie i ponownym uruchomieniu aplikacji na Androida pojawia się błąd - po uruchomieniu poniższego kodu.

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

       mCredential = new GoogleCredential(); 

       mCredential.setFromTokenResponse(mResponse); 

Kiedy próbuję debugowania na konsoli wykonać mCredential.setFromTokenResponse (mResponse). wyjątek zostanie podniesiona

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 

Jak mogę używać accessType offline?
Czy jest coś, co muszę zmodyfikować, aby użyć w tym trybie?

+1

Mam rozwiązać ten problem ... powinienem zadeklarować GoogleCredential za pomocą GoogleCredential.Build() zamiast nowego GoogleCredential(). – quantm

+1

Proszę napisać anser, a nie komentarz, w przeciwnym razie pozostaje pytanie w niezatwierdzonej sekcji – rds

+0

Według mojego zrozumienia, proszę sprawdzić, czy mam rację. – Bharathi

Odpowiedz