No puedo obtener la carpeta que acabo de crear en Google Drive

public class Helpers extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { SharedPreferences preferences; private static final String TAG = "BaseDriveActivity"; public static String EXISTING_FOLDER_ID; protected static final int REQUEST_CODE_RESOLUTION = 1; protected static final int NEXT_AVAILABLE_REQUEST_CODE = 2; public static final String folderId = "FOLDER_ID"; public static final String fileName = "folderId"; private GoogleApiClient mGoogleApiClient; @Override protected void onResume() { super.onResume(); if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Drive.API) .addScope(Drive.SCOPE_FILE) .addScope(Drive.SCOPE_APPFOLDER) // required for App Folder sample .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); } mGoogleApiClient.connect(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_RESOLUTION && resultCode == RESULT_OK) { mGoogleApiClient.connect(); } } @Override protected void onPause() { if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } super.onPause(); } final ResultCallback callback = new ResultCallback() { @Override public void onResult(DriveFolder.DriveFolderResult result) { if (!result.getStatus().isSuccess()) { showMessage("Error while trying to create the folder"); return; } EXISTING_FOLDER_ID = result.getDriveFolder().getDriveId().toString(); showMessage("Created a folder: " + result.getDriveFolder().getDriveId().toString()); preferences = getSharedPreferences(fileName , MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString(folderId , EXISTING_FOLDER_ID ); editor.apply(); } }; public void mcreateFolder() { MetadataChangeSet changeSet = new MetadataChangeSet.Builder() .setTitle("SmsSync").build(); Drive.DriveApi.getRootFolder(getGoogleApiClient()).createFolder( getGoogleApiClient(), changeSet).setResultCallback(callback); } @Override public void onConnected(Bundle bundle) { Log.i(TAG, "GoogleApiClient connected"); preferences = getSharedPreferences(fileName , MODE_PRIVATE); EXISTING_FOLDER_ID = preferences.getString(folderId ,null); if (EXISTING_FOLDER_ID == null ) { mcreateFolder(); } } @Override public void onConnectionSuspended(int cause) { Log.i(TAG, "GoogleApiClient connection suspended"); } @Override public void onConnectionFailed(ConnectionResult result) { Log.i(TAG, "GoogleApiClient connection failed: " + result.toString()); if (!result.hasResolution()) { // show the localized error dialog. GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show(); return; } try { result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Exception while starting resolution activity", e); } } public void showMessage(String message) { Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } public GoogleApiClient getGoogleApiClient() { return mGoogleApiClient; }} 

Quiero crear una carpeta cuando la aplicación está instalada y luego obtener su ID y guardarla en sharedprefrences … después de eso, quería crear un archivo dentro de esa carpeta, pero cuando uso pass the folderID para crear un archivo dentro de él, dice: “Can not encuentra DriveId. ¿Estás autorizado para ver este archivo?

si utilizo result.getDriveFolder().getDriveId().getResourceId() para obtener el ID que siempre es nulo.
Estoy usando este código para crear primero la carpeta que pegué https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFolderActivity.java

y para crear un archivo dentro de una carpeta, estoy usando esta guía https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFileInFolderActivity.java
folderiD la folderiD que folderiD y la paso para crear una función de archivo.

No mezcle DriveId con ResourceId. Ambos parecen cadenas, pero DriveId es diferente de ResourceId. Ver SO 21800257 . Además, ResourceId no está disponible de inmediato, ver SO 22874657 .

DriveId por lo general se ve así:

“DriveId: CAESHDBCMW1RVblahblahblahblahMYjAUgssy8yYFRTTNKRU55”

mientras que ResourceId se parece más a:

“UW2ablahblaghblahNy00Ums0B1mQ”

ACTUALIZAR:

Debido a que muchos desarrolladores luchan contra este problema, trataré de elaborar lo más profundo que mi conocimiento me permita.

  Google Drive Google Play Svcs YourApp (up in the cloud) (on your device) (on your device) +--------------------+ +--------------+ +--------------+ | 'id' (RESTful API) | - - -> ResourceId - - - -> ResourceId | +--------------------+ | DriveId - - - -> DriveId | +--------------+ +--------------+ 

Lo que trato de transmitir con la expresión artística anterior es:

  • Cuando crea un objeto de unidad (carpeta / archivo) en su dispositivo, GooPlaySvcs le dará DriveId
  • Puede usar este DriveId para comunicación local con GooPlaySvcs, puede almacenarlo en caché, etc.
  • Según el comentario de Daniel en SO 21800257 (enlace arriba), no confíes en que DriveId sea una cadena constante, supuestamente cambia sobre el objeto que se está cometiendo. Use DriveId.equals () (no lo probé)
  • Cada vez que salga del dispositivo local (Drive web interface, otras aplicaciones, YourApp en un dispositivo diferente), necesita usar ResourceId, que es el único ID único en la unidad (en la nube :-).
  • ResourceId está disponible para su DESPUÉS de que GooPlaySvcs confíe el objeto a la unidad. Hay formas de forzarlo, pero es una historia diferente (busque requestSync ()).
  • Si decide tomar el ResourceId y usarlo para llamadas RESTfull ( eliminar / trash ), tenga en cuenta que Google Play Services propaga sus cambios en un horario sobre el que no tiene control (por lo que parece, consulte requestSync ( ) problema de nuevo), y su pelea REST / GDAA puede causar daños a sus datos. Es posible que GDAA (GooPlayServices) no esté enterado de los cambios de REST por un tiempo. Tienes que administrar la sincronización tú mismo. Admito que fallé miserablemente cuando lo intenté.

    Buena suerte