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

Я хочу создать папку при установке приложения и чем получить его идентификатор и сохранить его в sharedprefrences..after, что я хотел, чтобы создать файл в этой папке, но когда я использую pass thatIDID папки для создания файла внутри него, чем он говорит «Не удается найти DriveId. Уполномочены ли вы просматривать этот файл?»не может получить folderId, что я только что созданный на Google диск

если я использую result.getDriveFolder().getDriveId().getResourceId() , чтобы получить идентификатор, отличный от его всегда null.
Я использую этот код, чтобы создать папку первой, которую я вставил 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, что спасти меня и передать его для создания файла функция.

ответ

8

Не смешивайте 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, вы можете кэшировать его и т. Д.
  • Комментарий от пользователя Daniel в SO 21800257 (ссылка выше), не полагайтесь на DriveId, чтобы быть постоянной строкой, он якобы изменяется на объект, являющийся co mmitted. Используйте DriveId.equals() (я не тестировал это)
  • В любое время, когда вы выходите за пределы локального устройства (веб-интерфейс Drive, другие приложения, YourApp на другом устройстве ), вам нужно использовать ResourceId, который является единственным уникальный идентификатор на Диске (вверх в облаке :-).
  • ResourceId доступен для вашего AFTER. GoOPlaySvcs передает объект на диск. Есть способов заставить его, но это совсем другая история (поиск по запросуSync()).
  • Если вы решили захватить RESOURCEID и использовать его для RESTfull вызовов (delete/trash), быть в курсе о том, что Google Play Services распространяется свои изменения в расписании вы не имеете контроля над (так, кажется, снова обратитесь к запросу requestSync()), и ваш REST/GDAA может привести к повреждению ваших данных. . GDAA (GooPlayServices) может не знать о ваших изменениях REST на некоторое время. У вас есть для управления синхронизацией самостоятельно. Я признаю, что потерпел неудачу, когда попытался.

    Good Luck

+0

Большое спасибо что вы помогли много. –