2015-03-19 3 views
0

Я получил этот код из Интернета, и я изменил его, чтобы автоматически загрузить определенный файл на Google Диск при запуске этой операции. Всегда спрашивайте меня, когда я начну эту деятельность, выбрать свою учетную запись Google! Я хочу, чтобы он спрашивал об учетной записи Google один раз, только когда был запущен в первый раз после установки, как это сделать?Android: как заставить мое приложение помнить Авторизация Google Диска?

package com.example.googledrive; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import java.util.Arrays; 
import java.io.IOException; 
import android.accounts.AccountManager; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.widget.Toast; 
import com.google.api.client.extensions.android.http.AndroidHttp; 
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; 
import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; 
import com.google.api.client.http.FileContent; 
import com.google.api.client.json.gson.GsonFactory; 
import com.google.api.services.drive.Drive; 
import com.google.api.services.drive.DriveScopes; 
import com.google.api.services.drive.model.File; 

public class MainActivity extends Activity { 
    static final int    REQUEST_ACCOUNT_PICKER = 1; 
    static final int    REQUEST_AUTHORIZATION = 2; 
    static final int    REQUEST_DOWNLOAD_FILE = 3; 
    static final int    RESULT_STORE_FILE = 4; 
    private static Uri    mFileUri; 
    private static Drive   mService; 
    private GoogleAccountCredential mCredential; 
    private Context     mContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     // setup for credentials for connecting to the Google Drive account 
     mCredential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE)); 

     // start activity that prompts the user for their google drive account 
     startActivityForResult(mCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);   
     // mContext = getApplicationContext(); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     getMenuInflater().inflate(R.menu.main, menu);  
     return true; 
    } 

    @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) { 
         mCredential.setSelectedAccountName(accountName); 
         mService = getDriveService(mCredential); 
        } 
        saveFileToDrive(); 
       } 
       break; 
      case REQUEST_AUTHORIZATION: 
       if (resultCode == Activity.RESULT_OK) { 
        //account already picked 
       } else { 
        startActivityForResult(mCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER); 
       } 
       break; 
     } 
    } 

    private Drive getDriveService(GoogleAccountCredential credential) 
    { 
     return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential) 
      .build(); 
    } 


    private void saveFileToDrive() 
    { 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        // Create URI from real path 
        String path; 
        path = "/sdcard/DCIM/Camera/a.png"; 
        mFileUri = Uri.fromFile(new java.io.File(path)); 

        ContentResolver cR = MainActivity.this.getContentResolver(); 

        // File's binary content 
        java.io.File fileContent = new java.io.File(mFileUri.getPath()); 
        FileContent mediaContent = new FileContent(cR.getType(mFileUri), fileContent); 

        showToast("Selected " + mFileUri.getPath() + "to upload"); 

        // File's meta data. 
        File body = new File(); 
        body.setTitle(fileContent.getName()); 
        body.setMimeType(cR.getType(mFileUri)); 

        com.google.api.services.drive.Drive.Files f1 = mService.files(); 
        com.google.api.services.drive.Drive.Files.Insert i1 = f1.insert(body, mediaContent); 
        File file = i1.execute(); 

        if (file != null) 
        { 
         showToast("Uploaded: " + file.getTitle()); 
        } 
       } catch (UserRecoverableAuthIOException e) { 
        startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        showToast("Transfer ERROR: " + e.toString()); 
       } 
      } 
     }); 
     t.start(); 
    } 

    public void showToast(final String toast) 
    { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

} 
+0

это другой вопрос может помочь: http://stackoverflow.com/questions/15641734/accountmanager-refresh- tokenoffline доступа – Gerardo

ответ

0

Это было некоторое время, так что вы, вероятно, удалось сделать это, но я просто искал то же самое, и это довольно легко. В коде, который вы используете и как он используется на нескольких сайтах, вы получаете намерение после вызова статического метода в GoogleAccountCredential.

Вы также можете создать свой собственный, вызывая статический метод в AccountPicker и определяя параметры, которые требуется только один раз выбрать.

Intent accountPicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"}, false, null, null, null, null); 
startActivityForResult(accountPicker, GOOGLE_ACCOUNT_PICKED); 

Четвертые пары является то, что вы хотите, и вы можете прочитать об этом здесь: https://developers.google.com/android/reference/com/google/android/gms/common/AccountPicker?hl=en

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