Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send multiple images those are present in folder to the google drive in android programmatically?

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?

like image 633
Hanuman Avatar asked Jan 31 '15 09:01

Hanuman


1 Answers

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

like image 163
seanpj Avatar answered Nov 10 '22 00:11

seanpj