Как прочитать файл из папки приложений на Google Диске без DriveId?

у меня есть функция и работает нормально! но его пропуск идентификатора диска? что, если идентификатор диска удален или уничтожен!

есть ли у них способ найти идентификатор диска?

я столкнулся с трудностями в таком сценарии

  1. пользователь повторно присоединится к моему приложению или сменит устройство
  2. если я пропустил свой идентификатор диска из общих настроек

================================================== ===== моя рабочая функция

 readFromGooDrive(DriveId mDriveId) {
      byte[] buf = null;
      if (getGoogleApiClient() != null && getGoogleApiClient().isConnected()) try {
        DriveFile df = Drive.DriveApi.getFile(getGoogleApiClient(), mDriveId);
        df.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
          .setResultCallback(new ResultCallback<DriveContentsResult>() {
          @Override
          public void onResult(DriveContentsResult driveContentsResult) {
            if ((driveContentsResult != null) && driveContentsResult.getStatus().isSuccess()) {
              DriveContents contents = driveContentsResult.getDriveContents();
                BufferedInputStream bis = new BufferedInputStream(contents.getInputStream());
                byte[] buffer = new byte[1024];
                int bytesread = 0;
                FileOutputStream outStream;
                try
                {
                    String databasePath = getBaseContext().getDatabasePath("my database").getPath();
                    outStream = new FileOutputStream(databasePath);
                    while( (bytesread = bis.read(buffer)) != -1)
                    {
                        outStream.write(buffer,0,bytesread);
                    }

                    outStream.flush();
                    bis.close();
                    outStream.close();
                }
                catch (FileNotFoundException e)
                {
                    Log.i(TAG,e.getMessage());
                }
                catch (IOException e)
                {
                    Log.i(TAG,e.getMessage());
                }
                finally {
                    Toast.makeText(getBaseContext(),"Data from Google Drive restored successfully." , Toast.LENGTH_LONG).show();
                }
                contents.discard(getGoogleApiClient());
            }
          }
        });
      } catch (Exception e) { e.printStackTrace(); }
    }

person Harish    schedule 26.09.2016    source источник
comment
прочитайте эту ссылку: developers.google.com/drive/android/auth я думаю, что нет нужно использовать driveID   -  person dipali    schedule 26.09.2016
comment
Не могли бы вы привести пример, когда DriveId будет удален?   -  person Teyam    schedule 27.09.2016
comment
Я загружаю файл mydb на диск в папку приложения. Теперь я удаляю приложение, затем снова устанавливаю и пытаюсь получить содержимое папки приложения, но у меня не получается без DriveId?   -  person Harish    schedule 28.09.2016


Ответы (1)


вам просто нужно скопировать файл .. он отлично работает, братан

private static final String TAG = "EditContentsActivity";

@Override
public void onConnected(Bundle connectionHint) {
    super.onConnected(connectionHint);

    Query query = new Query.Builder()
            .addFilter(Filters.contains(SearchableField.TITLE, "New file2.txt"))
            .build();
    Drive.DriveApi.query(getGoogleApiClient(), query)
            .setResultCallback(metadataCallback);


}

public class EditContentsAsyncTask extends ApiClientAsyncTask<DriveFile, Void, Boolean> {

    public EditContentsAsyncTask(Context context) {
        super(context);
    }

    @Override
    protected Boolean doInBackgroundConnected(DriveFile... args) {
        DriveFile file = args[0];
        try {
            DriveContentsResult driveContentsResult = file.open(
                    getGoogleApiClient(), DriveFile.MODE_WRITE_ONLY, null).await();
            if (!driveContentsResult.getStatus().isSuccess()) {
                return false;
            }
            DriveContents driveContents = driveContentsResult.getDriveContents();
            OutputStream outputStream = driveContents.getOutputStream();
            outputStream.write("New file2.txt".getBytes());
            com.google.android.gms.common.api.Status status =
                    driveContents.commit(getGoogleApiClient(), null).await();
            return status.getStatus().isSuccess();
        } catch (IOException e) {
            Log.e(TAG, "IOException while appending to the output stream", e);
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (!result) {
            showMessage("Error while editing contents");
            return;
        }
        showMessage("Successfully edited contents");
    }
}

final private ResultCallback<DriveApi.MetadataBufferResult> metadataCallback =
        new ResultCallback<DriveApi.MetadataBufferResult>() {
            @Override
            public void onResult(DriveApi.MetadataBufferResult result) {
                if (!result.getStatus().isSuccess()) {
                    showMessage("Problem while retrieving results");
                    return;
                }
                MetadataBuffer mdb = null;
                try {
                    mdb = result.getMetadataBuffer();
                    for (Metadata md : mdb) {
                        if (md == null || !md.isDataValid() || md.isTrashed()) continue;
                        // collect files
                        DriveId driveId = md.getDriveId();
                        String dId = driveId.encodeToString();
                        Log.i("checking",""+dId);
                        String mime = md.getMimeType();
                        String name=md.getTitle();
                        if(name.equals("New file2.txt")){
                            Log.i("checking2",""+dId);
                            Log.i("checking3",""+driveId.getResourceId());
                            Drive.DriveApi.fetchDriveId(getGoogleApiClient(), driveId.getResourceId())
                                    .setResultCallback(idCallback);
                            break;
                        }
                        //.....
                    }
                } finally { if (mdb != null) mdb.close(); }

            }
        };

final ResultCallback<DriveIdResult> idCallback = new ResultCallback<DriveIdResult>() {
    @Override
    public void onResult(DriveIdResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Cannot find DriveId. Are you authorized to view this file?");
            return;
        }
        DriveId driveId = result.getDriveId();
        DriveFile file = driveId.asDriveFile();
        new EditContentsAsyncTask(EditContentActivity.this).execute(file);
    }
};
person user6908055    schedule 01.10.2016