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;
}}
I want to create a folder when app is installed and than get its ID and save it to sharedprefrences..after that i wanted to create a file inside that folder but when i use pass that folderID to create file inside it than it says "Cannot find DriveId. Are you authorized to view this file?"
if I use result.getDriveFolder().getDriveId().getResourceId()
to get id than its always null.
I am using this code to create folder first which I pasted https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFolderActivity.java
and to create a file inside a folder I am using this guide
https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/CreateFileInFolderActivity.java
I am passing the folderiD
that I save and passing it to create file function.
Do not mix DriveId with ResourceId. Both look like strings, but DriveId is different from ResourceId. See SO 21800257. Also, ResourceId is not immediately available, see SO 22874657.
DriveId usually looks like:
"DriveId:CAESHDBCMW1RVblahblahblahblahMYjAUgssy8yYFRTTNKRU55"
whereas ResourceId is more like:
"UW2ablahblaghblahNy00Ums0B1mQ"
UPDATE:
Since so many developers fight this issue, I'll try to elaborate as deep as my knowledge allows me to.
Google Drive Google Play Svcs YourApp
(up in the cloud) (on your device) (on your device)
+--------------------+ +--------------+ +--------------+
| 'id' (RESTful API) | - - -> ResourceId - - - -> ResourceId |
+--------------------+ | DriveId - - - -> DriveId |
+--------------+ +--------------+
What I'm trying to convey with the artistic expression above is:
If you decide to grab the ResourceId and use it for RESTfull calls (delete/trash), be aware of the fact that Google Play Services propagates its changes on a schedule you don't have control over (so it seems, see the requestSync() issue again), and your REST/GDAA fight can cause damage to your data. GDAA(GooPlayServices) may not be aware of your REST changes for a while. You have to manage the synchronization yourself. I admit I failed miserably when I tried.
Good Luck