2016-07-01 3 views
1

Я пытаюсь включить API Google Диска в свое приложение для Android.Не удается пройти Google Диск «Выбрать учетную запись» на Android

Я добавил сервисы google для своих build.gradle, а также получил ключ API Android. Моя проблема находится в пределах OnResume(), где пользователь выбирает учетную запись.

Он просто хранит пользователя для выбора учетной записи и не действует.

Может мне кто-нибудь помочь?

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener{ 

    private static final String TAG = "Google Drive Activity"; 
    private static final int REQUEST_CODE_RESOLUTION = 1; 
    private static final int REQUEST_CODE_OPENER = 2; 
    private GoogleApiClient mGoogleApiClient; 
    private boolean fileOperation = false; 
    private DriveId mFileId; 
    public DriveFile file; 

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


    @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 
    protected void onStop() { 
     super.onStop(); 
     if (mGoogleApiClient != null) { 

      // disconnect Google API client connection 
      mGoogleApiClient.disconnect(); 
     } 
     super.onPause(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     Log.i(TAG, "GoogleApiClient connection failed: " + result.toString()); 

     if (!result.hasResolution()) { 
      GoogleApiAvailability.getInstance().getErrorDialog(this, result.getErrorCode(), 0).show(); 
      return; 
     } 


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

    @Override 
    public void onConnected(Bundle connectionHint) { 

     Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 

     Log.i(TAG, "GoogleApiClient connection suspended"); 
    } 

    public void onClickCreateFile(View view){ 
     fileOperation = true; 
     Drive.DriveApi.newDriveContents(mGoogleApiClient) 
       .setResultCallback(driveContentsCallback); 
    } 

    public void onClickOpenFile(View view){ 
     fileOperation = false; 
     Drive.DriveApi.newDriveContents(mGoogleApiClient) 
       .setResultCallback(driveContentsCallback); 
    } 

    public void OpenFileFromGoogleDrive(){ 
     IntentSender intentSender = Drive.DriveApi 
       .newOpenFileActivityBuilder() 
       .setMimeType(new String[] { "text/plain", "text/html" }) 
       .build(mGoogleApiClient); 
     try { 
      startIntentSenderForResult(
        intentSender, REQUEST_CODE_OPENER, null, 0, 0, 0); 
     } catch (IntentSender.SendIntentException e) { 
      Log.w(TAG, "Unable to send intent", e); 
     } 
    } 


    final ResultCallback<DriveApi.DriveContentsResult> driveContentsCallback = 
      new ResultCallback<DriveApi.DriveContentsResult>() { 
       @Override 
       public void onResult(DriveApi.DriveContentsResult result) { 
        if (result.getStatus().isSuccess()) { 
         if (fileOperation == true) { 
          CreateFileOnGoogleDrive(result); 
         } else { 
          OpenFileFromGoogleDrive(); 
         } 
        } 
       } 
      }; 


    public void CreateFileOnGoogleDrive(DriveApi.DriveContentsResult result){ 
     final DriveContents driveContents = result.getDriveContents(); 

     new Thread() { 
      @Override 
      public void run() { 
       // write content to DriveContents 
       OutputStream outputStream = driveContents.getOutputStream(); 
       Writer writer = new OutputStreamWriter(outputStream); 
       try { 
        writer.write("Hello abhay!"); 
        writer.close(); 
       } catch (IOException e) { 
        Log.e(TAG, e.getMessage()); 
       } 

       MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
         .setTitle("abhaytest2") 
         .setMimeType("text/plain") 
         .setStarred(true).build(); 

       Drive.DriveApi.getRootFolder(mGoogleApiClient) 
         .createFile(mGoogleApiClient, changeSet, driveContents) 
         .setResultCallback(fileCallback); 
      } 
     }.start(); 
    } 

    final private ResultCallback<DriveFolder.DriveFileResult> fileCallback = new 
      ResultCallback<DriveFolder.DriveFileResult>() { 
       @Override 
       public void onResult(DriveFolder.DriveFileResult result) { 
        if (result.getStatus().isSuccess()) { 
         Toast.makeText(getApplicationContext(), "file created: "+""+ 
           result.getDriveFile().getDriveId(), Toast.LENGTH_LONG).show(); 
        } 
        return; 
       } 
      }; 

    @Override 
    protected void onActivityResult(final int requestCode, 
            final int resultCode, final Intent data) { 
     switch (requestCode) { 
      case REQUEST_CODE_OPENER: 
       if (resultCode == RESULT_OK) { 
        mFileId = (DriveId) data.getParcelableExtra(
          OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 
        Log.e("file id", mFileId.getResourceId() + ""); 
        String url = "https://drive.google.com/open?id="+ mFileId.getResourceId(); 
        Intent i = new Intent(Intent.ACTION_VIEW); 
        i.setData(Uri.parse(url)); 
        startActivity(i); 
       } 
       break; 
      default: 
       super.onActivityResult(requestCode, resultCode, data); 
       break; 
     } 
    } 
} 

Это мой манифест. Блокировка ключа API.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="edu.moli9479csumb.version1googledrive"> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="AIzaSyD_2eJ5pPdRMysVwxxxxxxxxxxxxxx"/> 
     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version"/> 

     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

Задав здесь глупый вопрос, но вы включили API-интерфейс Drive в консоли разработчика Google? – Rajeev

+0

@ Rajeev ha да я сделал. – TheLearner

+0

Возможный дубликат [Infinite «Выберите цикл« при использовании API Google Диска »] (http://stackoverflow.com/questions/35503195/infinite-choose-an-account-loop-when-using-google-drive-api) –

ответ

0

Вы можете поделиться своим манифестом? Попробуйте сделать явный манифест для класса, в котором у вас есть следующий экран:

+0

Да, конечно. Это должно быть сейчас. – TheLearner

0

Вы получаете учетную запись, когда GoogleApiClient не может подключиться и имеет разрешение, требующее от пользователя авторизации приложения для API. Это происходит, когда вы вызываете «result.startResolutionForResult (this, REQUEST_CODE_RESOLUTION)»; из метода onConnectionFailed.

Как только пользователь выбирает учетную запись, ваша активность получает обратный вызов с кодом REQUEST_CODE_RESOLUTION. Этот код необходимо обработать, и вы должны вызвать apiClient.connect() для повторного подключения, когда этот код получен в методе onActivityResult.

Для получения более подробной информации см. this. Я надеюсь, что это работает :)

0

Вы можете легко заставить подсказывать пользователю выбрать учетную запись, используя [Account Picker] (https://developer.android.com/reference/android/accounts/AccountManager.html#newChooseAccountIntent(android.accounts.Account, java.util.ArrayList, java.lang.String [], логическое, java.lang.String , java.lang.String, java.lang.String [], android.os.Bundle)), общий сборщик учетных записей похож на стандартный сборщик учетных записей фреймов, введенный в newChooseAccountIntent. Возвращает намерение к активности, которая предлагает пользователю выбрать из списка учетных записей. Затем вызывающий абонент обычно начинает свою деятельность, вызывая startActivityForResult(intent, ...) ;.

При успешном завершении операции возвращается пакет с именем и типом учетной записи, указанным с использованием ключей KEY_ACCOUNT_NAME и KEY_ACCOUNT_TYPE.

Наиболее распространенный случай назвать это одним типом учетной записи, например:

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

Счет сборщика активность вернется, когда пользователь выбрал и/или создать учетную запись, и имя в результате счета может быть получен следующим образом:

protected void onActivityResult(final int requestCode, final int resultCode, 
final Intent data) { 
if (requestCode == SOME_REQUEST_CODE && resultCode == RESULT_OK) { 
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
} 
} 

Вот официальный Пример кода Google, который использует приведенный выше код с конкретным объяснением, как использовать API: https://developers.google.com/drive/v3/web/quickstart/android#step_5_setup_the_sample

0

Взгляните на свои методы onResume() и onConnectionFailded().

@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(TAG, "GoogleApiClient connection failed: " + result.toString()); 

    if (!result.hasResolution()) { 
     GoogleApiAvailability.getInstance().getErrorDialog(this, result.getErrorCode(), 0).show(); 
     return; 
    } 


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

Что происходит?

В onResume() вы создаете GoogleApiClient и вызываете connect(). Соединение завершается с ошибкой, поскольку у вас нет учетной записи.Выполняется метод onConnectionFailed(), который открывает разрешение, которое на самом деле является другим действием, вызывающим результат. Вы выбираете учетную запись, но я предполагаю, что авторизация не удалась или отменена. Вы возвращаетесь к своей первоначальной деятельности и выполняется onResume(). И ты снова по очереди. Почему ваша авторизация не работает? Я думаю, потому что что-то не так с вашими учетными данными. Перейдите в консоль разработчика и создайте учетные данные O Auth для своего пакета и вашей ключевой подписи.

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