Не могу получить folderId, который я только что создал на диске Google

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<DriveFolder.DriveFolderResult> callback = new ResultCallback<DriveFolder.DriveFolderResult>() {
    @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;
}}

Я хочу создать папку, когда приложение установлено, а затем получить его идентификатор и сохранить его в sharedprefferences.. после этого я хотел создать файл внутри этой папки, но когда я использую передать этот folderID для создания файла внутри него, он говорит: "Не могу найти DriveId. Вы авторизованы для просмотра этого файла?"

если я использую result.getDriveFolder().getDriveId().getResourceId()чтобы получить идентификатор, чем его всегда ноль.
Я использую этот код, чтобы сначала создать папку, которую я вставил https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFolderActivity.java

и для создания файла в папке я использую это руководство https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFileInFolderActivity.java
Я передаю folderiD что я сохраняю и передаю его для создания файловой функции.

1 ответ

Решение

Не смешивайте DriveId с ResourceId. Оба выглядят как строки, но DriveId отличается от ResourceId. Смотри SO 21800257. Кроме того, ResourceId не доступен сразу, см. SO 22874657.

DriveId обычно выглядит так:

"DriveId: CAESHDBCMW1RVblahblahblahblahMYjAUgssy8yYFRTTNKRU55"

тогда как ResourceId больше похож на:

"UW2ablahblaghblahNy00Ums0B1mQ"

ОБНОВИТЬ:

Поскольку многие разработчики борются с этой проблемой, я постараюсь развить настолько глубоко, насколько позволят мои знания.

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

То, что я пытаюсь передать с художественным выражением выше:

  • Когда вы создаете диск-объект (папку / файл) на своем устройстве, GooPlaySvcs выдаст вам DriveId
  • Вы можете использовать этот DriveId для локальной связи с GooPlaySvcs, вы можете кешировать его и т. Д.
  • Согласно комментарию Даниэля в SO 21800257 (ссылка выше), не следует полагать, что DriveId является константной строкой, она предположительно изменяется при фиксации объекта. Используйте DriveId.equals() (я этого не проверял)
  • Каждый раз, когда вы выходите за пределы локального устройства (веб-интерфейс диска, другие приложения, YourApp на другом устройстве), вам необходимо использовать ResourceId, который является единственным уникальным идентификатором на диске (в облаке:-).
  • ResourceId доступен для вашего ПОСЛЕ того, как GooPlaySvcs зафиксирует объект на диске. Есть способы заставить это, но это другая история (ищите requestSync()).
  • Если вы решили захватить ResourceId и использовать его для вызовов RESTfull ( delete / trash), имейте в виду тот факт, что Сервисы Google Play распространяют свои изменения по расписанию, которое вы не можете контролировать (так что, похоже, смотрите requestSync (), и ваш бой REST/GDAA может привести к повреждению ваших данных. GDAA(GooPlayServices) может некоторое время не знать о ваших изменениях REST. Вы должны сами управлять синхронизацией. Я признаю, что потерпел неудачу, когда попытался.

    Удачи

Другие вопросы по тегам