2016-05-19 2 views
0

Я пытаюсь войти в систему пользователя на Google и попытаться загрузить/скачать файл из Google Drive, это моя деятельность войтиGoogle Drive вход терпеть неудачу каждый раз, когда

import android.content.Intent; 
import android.content.IntentSender; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GoogleApiAvailability; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.drive.Drive; 

public class google extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener { 
private GoogleApiClient mGoogleApiClient; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_google); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Drive.API) 
      .addScope(Drive.SCOPE_FILE) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 

    mGoogleApiClient.connect(); 
} 

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    switch (requestCode) { 
     case 3: 
      if (resultCode == RESULT_OK) { 
       mGoogleApiClient.connect(); 
      } 
      break; 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mGoogleApiClient == null) { 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Drive.API) 
       .addScope(Drive.SCOPE_FILE) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
    } 

    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 
    Log.i("fail", "GoogleApiClient connection failed: " + result.toString()); 
    if (!result.hasResolution()) { 
     GoogleApiAvailability.getInstance().getErrorDialog(this, result.getErrorCode(), 0).show(); 
     return; 
    } 

    try { 
     result.startResolutionForResult(this, 3); 
    } catch (IntentSender.SendIntentException e) { 
     Log.e("ing", "Exception while starting resolution activity", e); 
    } 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    Log.i("conn", "API client connected."); 
} 

@Override 
public void onConnectionSuspended(int cause) { 
    Log.i("susp", "GoogleApiClient connection suspended"); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    if (mGoogleApiClient.isConnected()) { 
     mGoogleApiClient.disconnect(); 
    } 
} 
} 

только думаю, что я получаю это prompt, чтобы выбрать аккаунт снова и снова. это ошибка печати в LogCat:

GoogleApiClient connection failed: ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{aa798dc: [email protected]}, message=null} 

я уверен, что я делаю что-то неправильно в результате деятельности или onconnectionfailed, но я не могу понять, где и почему ..

ответ

0

У вас пробовал следовать Документу Google о Connecting and Authorizing the Google Drive Android API?

Авторизация для Android API Google Диска обрабатывается GoogleApiClient. Обычно это создается в методе onCreate().

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

mGoogleApiClient = new GoogleApiClient.Builder(this) 
.addApi(Drive.API) 
.addScope(Drive.SCOPE_FILE) 
.addConnectionCallbacks(this) 
.addOnConnectionFailedListener(this) 
.build(); 
} 


After you create the client, you must connect it for authorization to occur. 

@Override 
protected void onStart() { 
super.onStart(); 
mGoogleApiClient.connect(); 
} 

Попробуйте использовать этот OnCreate код и вместо onResume реализовать его как OnStart без включать области снова только Назвав mGoogleApiClient.connect();.

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

Примечание: Google Drive Android API поддерживает только drive.file и авторизации drive.appfolder областей. Если вашему приложению требуются дополнительные разрешения или функции, недоступные в API Android для Android, вы должны использовать Java API Java API.

Надеюсь, это поможет вам решить вашу проблему.

+1

я решил вопрос, код работал отлично, но я уже забыл заполнить анкету аутентификации на Google Developer консоли – VJgh

1

Может ли помочь эта сторонняя библиотека? Он отлично справляется с аутентификацией, и вы можете даже интегрировать других поставщиков с некоторыми строками кода.

// CloudStorage cs = new Box(context, "[clientIdentifier]", "[clientSecret]"); 
// CloudStorage cs = new OneDrive(context, "[clientIdentifier]", "[clientSecret]"); 
// CloudStorage cs = new GoogleDrive(context, "[clientIdentifier]", "[clientSecret]"); 
CloudStorage cs = new Dropbox(context, "[clientIdentifier]", "[clientSecret]"); 
new Thread() { 
    @Override 
    public void run() { 
     cs.createFolder("/TestFolder"); // <--- 
     InputStream stream = null; 
     try { 
      AssetManager assetManager = getAssets(); 
      stream = assetManager.open("UserData.csv"); 
      long size = assetManager.openFd("UserData.csv").getLength(); 
      cs.upload("/TestFolder/Data.csv", stream, size); // <--- 
     } catch (Exception e) { 
      // TODO: handle error 
     } finally { 
      // TODO: close stream 
     } 
    } 
}.start(); 

Вы можете получить его от GitHub: https://github.com/CloudRail/cloudrail-si-android-sdk

+0

это очень полезно, спасибо. Я бы хотел найти эту библиотеку давно ahahah .. но теперь мой код работает – VJgh

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