2016-03-01 4 views
1

Je suis en train utilisant le Google API for Android pour créer un fichier, recherche, télécharger et supprimer dans le dossier de l'application .API Drive pour Android: App dossier ne se synchroniser

Mais je reçois quelques problèmes ... Si je utilise le « getRootFolder() » pour sauver mon tout fichier fonctionne. Mais, si j'utilise 'getAppFolder()' rien ne fonctionne.

Exemple:

  1. L'utilisateur télécharger mon application, ma recherche d'application si elles existent tout fichier créé.

  2. Si rien ne retourne l'application, créez un nouveau fichier dans AppFolder.

  3. Si l'utilisateur désinstalle l'application et télécharge à nouveau, l'application ne peut pas accéder au fichier.

J'essaie 'requestSync', mais rien ne se passe. J'essaie d'utiliser le Écoute des modifications et En recevant les événements de complétion, ils renvoient 'Success' mais ne synchronisent toujours pas AppFolder.

J'ai vu des problèmes similaires, mais aucun ne fonctionne pour moi.

Si j'utilise le tout 'getRootFolder() fonctionne très bien ...

peut les gars vous aider?

Voici quelques exemples de code:

onConnected:

@Override 
public void onConnected(Bundle connectionHint) { 
    super.onConnected(connectionHint); 
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
    if (sharedPreferences.getBoolean("automaticBackup", true)) { 
     String FILE_PATH = this.getDatabasePath(DataHelper.DATABASE_NAME).getPath(); 
     String extension = MimeTypeMap.getFileExtensionFromUrl(FILE_PATH); 
     type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
     file = new File(FILE_PATH); 

     if (hasInternetAccess()) { 
      if (sharedPreferences.getBoolean("firstUse", true)) { 
       Drive.DriveApi.query(getGoogleApiClient(), query).setResultCallback(restoreCallBack); 
       final SharedPreferences.Editor editor = sharedPreferences.edit(); 
       editor.putBoolean("firstUse", false); 
       editor.apply(); 
      } else { 
       // delete existing backup 
       Drive.DriveApi.query(getGoogleApiClient(), query).setResultCallback(checkIfFileExists); 
      } 
     } 
    } 
} 

Ici je vérifie si le fichier existe, le vrai suppression, faux en créer un nouveau:

final private ResultCallback<DriveApi.MetadataBufferResult> checkIfFileExists = new ResultCallback<DriveApi.MetadataBufferResult>() { 

    private DriveId fileId; 

    @Override 
    public void onResult(@NonNull DriveApi.MetadataBufferResult result) { 
     if (!result.getStatus().isSuccess()) { 
      showMessage("Problem while checking if file exists..."); 
      return; 
     } 

     MetadataBuffer metadata = result.getMetadataBuffer(); 
     if (metadata.getCount() > 0) { 
      fileId = metadata.get(0).getDriveId(); 
      if (fileId != null) { 
       Drive.DriveApi.fetchDriveId(getGoogleApiClient(), fileId.getResourceId()).setResultCallback(deleteFile); 
      } 
     } else { 
      Log.d(TAG, "No backup file found"); 
      // create new contents resource 
      Drive.DriveApi.newDriveContents(getGoogleApiClient()).setResultCallback(createBackupCallBack); 
     } 
    } 
}; 

Voici le code à supprimer:

final private ResultCallback<DriveApi.DriveIdResult> deleteFile = new ResultCallback<DriveApi.DriveIdResult>() { 

    @Override 
    public void onResult(@NonNull DriveApi.DriveIdResult driveIdResult) { 
     final DriveId driveId = driveIdResult.getDriveId(); 

     try { 
      new AsyncTask<Void, Void, String>() { 
       @Override 
       protected String doInBackground(Void... params) { 
        DriveId fileId = DriveId.decodeFromString(driveId.encodeToString()); 
        DriveFile driveFile = fileId.asDriveFile(); 
        com.google.android.gms.common.api.Status deleteStatus = driveFile.delete(getGoogleApiClient()).await(); 
        if (!deleteStatus.isSuccess()) { 
         Log.e(TAG, "Unable to delete the old backup"); 
         return null; 
        } 
        sharedPreferences.edit().remove(driveId.toString()).apply(); 
        Log.d(TAG, "Removed old backup."); 
        return null; 
       } 

       @Override 
       protected void onPostExecute(String s) { 
        super.onPostExecute(s); 
        // create new contents resource 
        Drive.DriveApi.newDriveContents(getGoogleApiClient()).setResultCallback(createBackupCallBack); 
       } 
      }.execute().get(); 
     } catch (ExecutionException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

Téléchargez le fichier sur le lecteur:

final private ResultCallback<DriveApi.DriveContentsResult> createBackupCallBack = new 
     ResultCallback<DriveApi.DriveContentsResult>() { 

      @Override 
      public void onResult(@NonNull DriveApi.DriveContentsResult result) { 
       if (!result.getStatus().isSuccess()) { 
        showMessage("Error while trying to create new file contents"); 
        return; 
       } 
       final DriveContents driveContents = result.getDriveContents(); 

       new AsyncTask<Void, Void, String>() { 
        @Override 
        protected String doInBackground(Void... params) { 

         OutputStream outputStream = driveContents.getOutputStream(); 

         byte[] buffer = new byte[1024]; 
         int bytesRead; 
         try { 
          BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file)); 
          while ((bytesRead = inputStream.read(buffer)) != -1) { 
           outputStream.write(buffer, 0, bytesRead); 
          } 
          outputStream.flush(); 
          outputStream.close(); 
          inputStream.close(); 
         } catch (IOException e) { 
          Log.e(TAG, e.getMessage()); 
         } 

         MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
           .setTitle(DataHelper.DATABASE_NAME) 
           .setMimeType(type) 
           .setStarred(true).build(); 

         Drive.DriveApi.getAppFolder(getGoogleApiClient()) 
           .createFile(getGoogleApiClient(), changeSet, driveContents) 
           .setResultCallback(fileCallback); 
         return null; 
        } 
       }.execute(); 
      } 
     }; 

Résultat Appel retour de téléchargement:

final private ResultCallback<DriveApi.MetadataBufferResult> restoreCallBack = new ResultCallback<DriveApi.MetadataBufferResult>() { 

    DriveId driveId; 

    @Override 
    public void onResult(@NonNull DriveApi.MetadataBufferResult result) { 
     if (!result.getStatus().isSuccess()) { 
      showMessage("Problem while restoring..."); 
     } 

     MetadataBuffer metadata = result.getMetadataBuffer(); 
     if (metadata.getCount() > 0) { 
      File fileBD = getDatabasePath(DataHelper.DATABASE_NAME); 
      boolean deleted = fileBD.delete(); 
      Log.d("DELETED", deleted + ""); 
      driveId = metadata.get(0).getDriveId(); 
      Drive.DriveApi.fetchDriveId(getGoogleApiClient(), driveId.getResourceId()).setResultCallback(idCallback); 
     } else { 
      Log.d(TAG, "No backup file found!"); 
     } 
    } 
}; 
+1

Est-il possible que l'utilisateur désinstalle l'application avant que les fichiers sont téléchargés avec succès sur le serveur? Lorsque l'utilisateur désinstalle l'application, les fichiers sont supprimés de l'appareil. Vous pouvez utiliser les événements d'achèvement pour vérifier que les fichiers sont téléchargés sur le serveur. – Anatoli

+0

Utilisez déjà le ComplemetionEvent et il retourne 'Success' à la fin, puis je désinstalle l'application et installez à nouveau l'application ne peut pas trouver le fichier si elles sont dans AppFolder. Si elles sont dans RootFolder est presque instantanée. –

+0

Vérifiez peut-être que l'application est toujours autorisée après la désinstallation (https://support.google.com/drive/answer/2523073?hl=fr). – Anatoli

Répondre

0

Il peut être question d'autorisation. L'ajout d'étendues d'autorisation drive.appfolder à GoogleApiClient peut résoudre votre problème.Par exemple:

mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Drive.API) 
      .addScope(Drive.SCOPE_APPFOLDER) // required to access app folder 
      .addOnConnectionFailedListener(this) 
      .addConnectionCallbacks(this) 
      .build(); 
    mGoogleApiClient.connect(); 
+0

J'ai déjà obtenu ce que je voulais faire, en utilisant le AppFolder, mais merci quand même –

+0

Vous êtes les bienvenus. –

0

Vous avez trouvé une solution, vous devez synchroniser avec le lecteur avant d'interroger le AppFolder.

Utilisez cette après la connexion au lecteur:

Drive.DriveApi.requestSync(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() { 
    @Override 
    public void onResult(@NonNull Status status) { 

    } 
});