Ich kann nicht folderId bekommen, dass ich gerade auf Google Drive erstellt habe

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

Ich möchte einen Ordner erstellen, wenn App installiert ist und dann seine ID und speichern Sie es in Shared Prefrences..nach dem ich eine Datei in diesem Ordner erstellen wollte, aber wenn ich benutze diese OrdnerID, um eine Datei darin zu erstellen, als es sagt “Kann nicht find DriveId. Sind Sie berechtigt, diese Datei anzuzeigen? “

Wenn ich result.getDriveFolder().getDriveId().getResourceId() , um eine ID zu erhalten, die immer Null ist.
Ich verwende diesen Code, um zuerst einen Ordner zu erstellen, den ich https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFolderActivity.java eingefügt habe

und um eine Datei in einem Ordner zu erstellen, verwende ich diese Anleitung https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFileInFolderActivity.java
Ich übergebe den folderiD , den ich speichere und folderiD , um die folderiD zu erstellen.

   

Mischen Sie DriveId nicht mit ResourceId. Beide sehen wie Zeichenfolgen aus, aber DriveId unterscheidet sich von ResourceId. Siehe SO 21800257 . Außerdem ist ResourceId nicht sofort verfügbar, siehe SO 22874657 .

DriveId sieht normalerweise wie folgt aus:

“DriveId: CAESHDBCMW1RVblahblahblahblahMYjAUgssy8yYFRTTNKRU55”

während ResourceId eher wie folgt aussieht:

“UW2ablahblaghblahNy00Ums0B1mQ”

AKTUALISIEREN:

Da so viele Entwickler dieses Problem bekämpfen, werde ich versuchen, so tief zu gehen, wie es mein Wissen erlaubt.

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

Was ich mit dem obigen künstlerischen Ausdruck zu vermitteln versuche, ist:

  • Wenn Sie ein Laufwerksobjekt (Ordner / Datei) auf Ihrem Gerät erstellen, erhalten Sie von GooPlaySvcs die DriveId
  • Sie können diese DriveId für die lokale Kommunikation mit GooPlaySvcs verwenden, Sie können sie zwischenspeichern usw.
  • Pro Daniels Kommentar in SO 21800257 (Link oben), verlassen Sie sich nicht auf DriveId, um eine konstante Zeichenfolge zu sein, es ändert sich angeblich auf das Objekt, das festgeschrieben wird. Verwenden Sie DriveId.equals () (Ich habe das nicht getestet)
  • Jedes Mal, wenn Sie das lokale Gerät verlassen (Drive Web-Oberfläche, andere Apps, YourApp auf einem anderen Gerät), müssen Sie ResourceId verwenden, die einzige eindeutige ID auf dem Laufwerk (oben in der Cloud :-).
  • Die ResourceId steht Ihrem AFTER GooPlaySvcs Commit für das Objekt zum Drive zur Verfügung. Es gibt Möglichkeiten, es zu erzwingen, aber es ist eine andere Geschichte (Suche nach requestSync ()).
  • Wenn Sie sich entscheiden, die ResourceId zu verwenden und sie für REST-Aufrufe ( delete / trash ) zu verwenden, sollten Sie sich darüber im Klaren sein, dass Google Play Services seine Änderungen nach einem Zeitplan verbreitet, den Sie nicht kontrollieren können. ) erneut auftreten), und Ihr REST / GDAA-Kampf kann Ihre Daten beschädigen. GDAA (GooPlayServices) erkennt möglicherweise Ihre REST-Änderungen für eine Weile nicht. Sie müssen die Synchronisation selbst verwalten. Ich gebe zu, dass ich kläglich versagt habe, als ich es versuchte.

    Viel Glück