I want to send multiple images those are present in my internal storage and when i selects that folder i want upload that folder into google drive. i have tried this google drive api for android https://developers.google.com/drive/android/create-file
and i have used the below code but it shows some error in getGoogleApiClient
the code is
ResultCallback<DriveContentsResult> contentsCallback = new
ResultCallback<DriveContentsResult>() {
@Override
public void onResult(DriveContentsResult result) {
if (!result.getStatus().isSuccess()) {
// Handle error
return;
}
MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
.setMimeType("text/html").build();
IntentSender intentSender = Drive.DriveApi
.newCreateFileActivityBuilder()
.setInitialMetadata(metadataChangeSet)
.setInitialDriveContents(result.getDriveContents())
.build(getGoogleApiClient());
try {
startIntentSenderForResult(intentSender, 1, null, 0, 0, 0);
} catch (SendIntentException e) {
// Handle the exception
}
}
}
is there any approach to send images to drive or gmail?
I can't give you the exact code that does what you need, but you may try to modify the code I use for testing Google Drive Android API (GDAA). It creates folders and uploads files to Google Drive. It is up to you if you choose the REST or GDAA flavor, each has it's specific advantages.
This covers only a half of your question, though. Selecting and enumerating files on your Android device should be covered elsewhere.
UPDATE: (per Frank's comment below)
The example I mentioned above would give you a full solution from scratch, but let's address the points of your question I could decipher:
The hurdle 'some error' is a method that returns GoogleApiClient object initialized prior to your code sequence. Would look something like:
GoogleApiClient mGAC = new GoogleApiClient.Builder(appContext)
.addApi(Drive.API).addScope(Drive.SCOPE_FILE)
.addConnectionCallbacks(callerContext)
.addOnConnectionFailedListener(callerContext)
.build();
If you have this cleared out, let's assume your folder is represented by a java.io.File object. Here is the code that:
1/ enumerates the files in you local folder
2/ sets the name, content and MIME type of each file (using jpeg for simplicity here).
3/ uploads each file to the root folder of Google drive
(the create() method must run off-UI thread)
// enumerating files in a folder, uploading to Google Drive
java.io.File folder = ...;
for (java.io.File file : folder.listFiles()) {
create("root", file.getName(), "image/jpeg", file2Bytes(file))
}
/******************************************************
* create file/folder in GOODrive
* @param prnId parent's ID, (null or "root") for root
* @param titl file name
* @param mime file mime type
* @param buf file contents (optional, if null, create folder)
* @return file id / null on fail
*/
static String create(String prnId, String titl, String mime, byte[] buf) {
DriveId dId = null;
if (mGAC != null && mGAC.isConnected() && titl != null) try {
DriveFolder pFldr = (prnId == null || prnId.equalsIgnoreCase("root")) ?
Drive.DriveApi.getRootFolder(mGAC):
Drive.DriveApi.getFolder(mGAC, DriveId.decodeFromString(prnId));
if (pFldr == null) return null; //----------------->>>
MetadataChangeSet meta;
if (buf != null) { // create file
DriveContentsResult r1 = Drive.DriveApi.newDriveContents(mGAC).await();
if (r1 == null || !r1.getStatus().isSuccess()) return null; //-------->>>
meta = new MetadataChangeSet.Builder().setTitle(titl).setMimeType(mime).build();
DriveFileResult r2 = pFldr.createFile(mGAC, meta, r1.getDriveContents()).await();
DriveFile dFil = r2 != null && r2.getStatus().isSuccess() ? r2.getDriveFile() : null;
if (dFil == null) return null; //---------->>>
r1 = dFil.open(mGAC, DriveFile.MODE_WRITE_ONLY, null).await();
if ((r1 != null) && (r1.getStatus().isSuccess())) try {
Status stts = bytes2Cont(r1.getDriveContents(), buf).commit(mGAC, meta).await();
if ((stts != null) && stts.isSuccess()) {
MetadataResult r3 = dFil.getMetadata(mGAC).await();
if (r3 != null && r3.getStatus().isSuccess()) {
dId = r3.getMetadata().getDriveId();
}
}
} catch (Exception e) { /* error handling*/ }
} else {
meta = new MetadataChangeSet.Builder().setTitle(titl).setMimeType("application/vnd.google-apps.folder").build();
DriveFolderResult r1 = pFldr.createFolder(mGAC, meta).await();
DriveFolder dFld = (r1 != null) && r1.getStatus().isSuccess() ? r1.getDriveFolder() : null;
if (dFld != null) {
MetadataResult r2 = dFld.getMetadata(mGAC).await();
if ((r2 != null) && r2.getStatus().isSuccess()) {
dId = r2.getMetadata().getDriveId();
}
}
}
} catch (Exception e) { /* error handling*/ }
return dId == null ? null : dId.encodeToString();
}
//-----------------------------
static byte[] file2Bytes(File file) {
if (file != null) try {
return is2Bytes(new FileInputStream(file));
} catch (Exception e) {}
return null;
}
//----------------------------
static byte[] is2Bytes(InputStream is) {
byte[] buf = null;
BufferedInputStream bufIS = null;
if (is != null) try {
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
bufIS = new BufferedInputStream(is);
buf = new byte[2048];
int cnt;
while ((cnt = bufIS.read(buf)) >= 0) {
byteBuffer.write(buf, 0, cnt);
}
buf = byteBuffer.size() > 0 ? byteBuffer.toByteArray() : null;
} catch (Exception e) {}
finally {
try {
if (bufIS != null) bufIS.close();
} catch (Exception e) {}
}
return buf;
}
//--------------------------
private static DriveContents bytes2Cont(DriveContents driveContents, byte[] buf) {
OutputStream os = driveContents.getOutputStream();
try { os.write(buf);
} catch (IOException e) {/*error handling*/}
finally {
try { os.close();
} catch (Exception e) {/*error handling*/}
}
return driveContents;
}
Needles to say the code here is taken directly from the GDAA wrapper here (mentioned at the beginning), so if you need to resolve any references you have to look up the code there.
Good Luck
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With