-1

My Android app should offer the functionality of sharing files via google drive:

1) upload a file (which was selected previously from the sd-card) to google drive
2) get back a link (url) to the uploaded file
3) share this link with other users of the app
4) other users may download the shared file to the sd-card of their device

All this functionality should be available in the app, without having the need to use a browser.
Does anyone have an idea how i can implement the steps 1, 2 and 4?
thanks in advance!
gerhard

seanpj
  • 6,735
  • 2
  • 33
  • 54
gerhard
  • 479
  • 1
  • 6
  • 15
  • point 3: are all the users using the same Android app, or do you consider using other (possibly non-Android) apps? (reading / writing files) – seanpj May 08 '15 at 17:02
  • hi seanpj! yes, all the users will use the same android app. this means: access to the uploaded file will be from the android app only. – gerhard May 08 '15 at 17:07
  • And I assume all the users are accessing the Drive under different Google logins (gmail accounts), right? – seanpj May 08 '15 at 17:12
  • no, there will be just one accout which will be shared (e.g. i will have 1 TB drive space, later maybe more, and i will pay the monthly fee for this), every user will upload to this account / download from this account. this means, no login to the drive account should be required. – gerhard May 08 '15 at 17:17

1 Answers1

0

This can help you for Google Drive file upload -

First, go for authentication

AccountManager am = AccountManager.get(activity);
  am.getAuthToken(am.getAccounts())[0],
    "oauth2:" + DriveScopes.DRIVE,
  new Bundle(),
  true,
  new OnTokenAcquired(),
  null);

Now need to set token

     private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
    @Override
    public void run(AccountManagerFuture<Bundle> result) {
        try {
            final String token = result.getResult().getString(AccountManager.KEY_AUTHTOKEN);
            HttpTransport httpTransport = new NetHttpTransport();
            JacksonFactory jsonFactory = new JacksonFactory();
            Drive.Builder b = new Drive.Builder(httpTransport, jsonFactory, null);
            b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
                @Override
                public void initialize(JSonHttpRequest request) throws IOException {
                    DriveRequest driveRequest = (DriveRequest) request;
                    driveRequest.setPrettyPrint(true);
                    driveRequest.setKey(CLIENT ID YOU GOT WHEN SETTING UP THE CONSOLE BEFORE YOU STARTED CODING)
                    driveRequest.setOauthToken(token);
                }
            });

            final Drive drive = b.build();

            final com.google.api.services.drive.model.File body = new 
          com.google.api.services.drive.model.File();
            body.setTitle("My Test File");
          body.setDescription("A Test File");
           body.setMimeType("text/plain");

            final FileContent mediaContent = new FileContent("text/plain",  
            "Your data")
            new Thread(new Runnable() {
                public void run() {
                    try {
                        com.google.api.services.drive.model.File file =   
                 drive.files().insert(body, mediaContent).execute();
                        alreadyTriedAgain = false; 
                    } catch (IOException e) {
                        if (!alreadyTriedAgain) {
                            alreadyTriedAgain = true;
                            AccountManager am = AccountManager.get(activity);
                            am.invalidateAuthToken(am.getAccounts()[0].type, null); // Requires the permissions MANAGE_ACCOUNTS & USE_CREDENTIALS in the Manifest
                            am.getAuthToken (same as before...)
                        } else {
                            // Give up. Crash or log an error or whatever you want.
                        }
                    }
                }
            }).start();
            Intent launch = (Intent)result.getResult().get(AccountManager.KEY_INTENT);
            if (launch != null) {
                startActivityForResult(launch, 3025);
                return; // Not sure why... I wrote it here for some reason. Might not actually be necessary.
            }
        } catch (OperationCanceledException e) {
            // Handle it...
        } catch (AuthenticatorException e) {
            // Handle it...
        } catch (IOException e) {
            // Handle it...
        }
    }
}

Now, To update the file

    public void updateFile(Drive drive, File gFile, java.io.File jFile) throws   
    IOException {
        FileContent gContent = new FileContent("text/csv", jFile);
        gFile.setModifiedDate(new DateTime(false, jFile.lastModified(), 0));
        gFile = drive.files().update(gFile.getId(), gFile,   
        gContent).setSetModifiedDate(true).execute();
     }

Also, Don't fget to give permissions in Manifest for

GET_ACCOUNTS, USE_CREDENTIALS, MANAGE_ACCOUNTS, INTERNET WRITE_EXTERNAL_STORAGE 
Jambaaz
  • 2,788
  • 1
  • 19
  • 30