GPlayServices #1: Save to Google Drive
A little snippet to save a file (or some contents) in Google Drive with the Drive API included in the Google Play Services.
To use the Google Drive API we have to follow these steps:(this blog doesn't cover these topics) :
First of all, we have to create an instance of GoogleApiClient using the GoogleApiClient.Builder and implementing the callback interfaces to manage the connection and the authorizations as described in GPlay Service #0.
Our scope is to save a file (an image) choosing a folder in Google Drive.
To choose a folder inside our Google Drive we can use the Drive.DriveApi.newOpenFileActivityBuilder().
This method creates a builder for an Open File activity that allows user selection of a Drive file. Upon completion, the result Intent will contain the DriveId for the selected file.
We can use the OnConnected interface to know when the connect request has successfully completed, setup the Intent to create the builder and enable the Button to save
In our example we will use a Button to launch the Folder Picker.
Clicking the Button the
We can retrieve the Folder Drive id using this code:
Also in this case we can use an asynchronous call to know if our request has successfully completed.
You can get code from GitHub:
To use the Google Drive API we have to follow these steps:(this blog doesn't cover these topics) :
- Set Up Google Play Services SDK
- Register your app in Google Developers Console to activate the API
First of all, we have to create an instance of GoogleApiClient using the GoogleApiClient.Builder and implementing the callback interfaces to manage the connection and the authorizations as described in GPlay Service #0.
Our scope is to save a file (an image) choosing a folder in Google Drive.
To choose a folder inside our Google Drive we can use the Drive.DriveApi.newOpenFileActivityBuilder().
This method creates a builder for an Open File activity that allows user selection of a Drive file. Upon completion, the result Intent will contain the DriveId for the selected file.
We can use the OnConnected interface to know when the connect request has successfully completed, setup the Intent to create the builder and enable the Button to save
@Override public void onConnected(Bundle connectionHint) { super.onConnected(connectionHint); //Enable the save button and intentPicker if (intentPicker == null) { intentPicker = buildIntent(); } mSave.setEnabled(true); } private IntentSender buildIntent(){ return Drive.DriveApi .newOpenFileActivityBuilder() .setMimeType(new String[]{DriveFolder.MIME_TYPE}) .build(mGoogleApiClient); }It is important to use the
DriveFolder.MIME_TYPE
to allow user selection of a Drive folder.In our example we will use a Button to launch the Folder Picker.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gdrive); //Setup the Save Button mSave = (Button) findViewById(R.id.save_to_gdrive); mSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { if (mGoogleApiClient!=null && mGoogleApiClient.isConnected()){ if (intentPicker==null) intentPicker = buildIntent(); //Start the picker to choose a folder startIntentSenderForResult( intentPicker, REQUEST_CODE_PICKER, null, 0, 0, 0); } } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Unable to send intent", e); } } }); mSave.setEnabled(false); }
Clicking the Button the
GoogleApiClient
will launch the Activity to allow user selection of a Drive folder.We can retrieve the Folder Drive id using this code:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CODE_PICKER: intentPicker = null; if (resultCode == RESULT_OK) { //Get the folder drive id mFolderDriveId = (DriveId) data.getParcelableExtra( OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); if (mFolderDriveId != null) { //Create the file on GDrive Drive.DriveApi.newContents(mGoogleApiClient) .setResultCallback(creatingFileResult); } } break; default: super.onActivityResult(requestCode, resultCode, data); break; } }Now we can save our bitmap in the selected folder using an asynchronous call implementing a ResultCallback
final private ResultCallbackOf course it is just an example.creatingFileResult = new ResultCallback () { @Override public void onResult(DriveApi.ContentsResult result) { if (!result.getStatus().isSuccess()) { showMessage("Error while trying to create new file contents"); return; } DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, mFolderDriveId); OutputStream outputStream = result.getContents().getOutputStream(); Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.sea); ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, bitmapStream); try { outputStream.write(bitmapStream.toByteArray()); } catch (IOException e1) { Log.i(TAG, "Unable to write file contents."); } MetadataChangeSet changeSet = new MetadataChangeSet.Builder() .setTitle("New file") //Your title .setMimeType("image/jpeg") //Your mime type .setStarred(false).build(); folder.createFile(mGoogleApiClient, changeSet, result.getContents()) .setResultCallback(fileCallback); } };
Also in this case we can use an asynchronous call to know if our request has successfully completed.
final private ResultCallbackAnd that's all.fileCallback = new ResultCallback () { @Override public void onResult(DriveFolder.DriveFileResult result) { if (!result.getStatus().isSuccess()) { showMessage("Error while trying to create the file"); return; } showMessage("File saved on Google Drive"); } };
You can get code from GitHub:
Comments
Post a Comment