0

My app can save an image to Google Drive (like https://github.com/googledrive/android-quickstart). How can I get the URL of the uploaded image and save it in a variable, for showing it to the user in textview, and save it into an SQLite database?

public class Phototodrive extends Activity implements ConnectionCallbacks,OnConnectionFailedListener{

private static final String TAG = "android-drive-quickstart";
private static final int REQUEST_CODE_CAPTURE_IMAGE = 1;
private static final int REQUEST_CODE_CREATOR = 2;
private static final int REQUEST_CODE_RESOLUTION = 3;

private GoogleApiClient mGoogleApiClient;
private Bitmap mBitmapToSave;  

/**
 * Create a new file and save it to Drive. 
 */ 

private void saveFileToDrive() {  
    // Start by creating a new contents, and setting a callback.
    Log.i(TAG, "Creating new contents.");
    final Bitmap image = mBitmapToSave;    
    Drive.DriveApi.newContents(mGoogleApiClient).setResultCallback(new ResultCallback<ContentsResult>() { 


        public void onResult(ContentsResult result) {
            // If the operation was not successful, we cannot do anything
            // and must
            // fail.
            if (!result.getStatus().isSuccess()) {
                Log.i(TAG, "Failed to create new contents."); 
                return; 
            }
            // Otherwise, we can write our data to the new contents.
            Log.i(TAG, "New contents created.");
            // Get an output stream for the contents.
            OutputStream outputStream = result.getContents().getOutputStream();
            // Write the bitmap data from it.
            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.");
            }
            // Create the initial metadata - MIME type and title.
            // Note that the user will be able to change the title later.
            MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
                    .setMimeType("image/jpeg").setTitle("Doc_scan.jpg").build();
            // Create an intent for the file chooser, and start it.
            IntentSender intentSender = Drive.DriveApi
                    .newCreateFileActivityBuilder() 
                    .setInitialMetadata(metadataChangeSet)
                    .setInitialContents(result.getContents())
                    .build(mGoogleApiClient);
            try {
                startIntentSenderForResult(
                        intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0);
            } catch (SendIntentException e) {
                Log.i(TAG, "Failed to launch file chooser.");
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    if (mGoogleApiClient == null) {
        // Create the API client and bind it to an instance variable.
        // We use this instance as the callback for connection and connection
        // failures.
        // Since no account name is passed, the user is prompted to choose.
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }
    // Connect the client. Once connected, the camera is launched.
    mGoogleApiClient.connect();
}

@Override
protected void onPause() { 
    if (mGoogleApiClient != null) {
        mGoogleApiClient.disconnect();
    }
    super.onPause();
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    switch (requestCode) {
        case REQUEST_CODE_CAPTURE_IMAGE:
            // Called after a photo has been taken.
            if (resultCode == Activity.RESULT_OK) {
                // Store the image data as a bitmap for writing later.
                mBitmapToSave = (Bitmap) data.getExtras().get("data");
            }
            break;
        case REQUEST_CODE_CREATOR:
            // Called after a file is saved to Drive.
            if (resultCode == RESULT_OK) {
                Log.i(TAG, "Image successfully saved.");
                mBitmapToSave = null;
                // Just start the camera again for another photo.
                startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
                        REQUEST_CODE_CAPTURE_IMAGE); 
            }
            break;
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // Called whenever the API client fails to connect.
    Log.i(TAG, "GoogleApiClient connection failed: " + result.toString());
    if (!result.hasResolution()) {
        // show the localized error dialog.
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
        return;
    }
    // The failure has a resolution. Resolve it.
    // Called typically when the app is not yet authorized, and an
    // authorization
    // dialog is displayed to the user.
    try {
        result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
    } catch (SendIntentException e) {
        Log.e(TAG, "Exception while starting resolution activity", e);
    }
}

@Override
public void onConnected(Bundle connectionHint) {
    Log.i(TAG, "API client connected.");
    if (mBitmapToSave == null) {
        // This activity has no UI of its own. Just start the camera.
        startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
                REQUEST_CODE_CAPTURE_IMAGE);
        return;
    }
    saveFileToDrive();
}

@Override
public void onConnectionSuspended(int i) {
    Log.i(TAG, "GoogleApiClient connection suspended");
}   


final private ResultCallback<DriveFileResult> fileCallback = new ResultCallback<DriveFileResult>(){
    @Override
    public void onResult(DriveFileResult result) {
        if (!result.getStatus().isSuccess()){
            //showMessage("Error");
            Toast.makeText(getApplicationContext(), "Error",
                       Toast.LENGTH_LONG).show();
            return;
        }
    //  showMessage("Created a file: " + result.getDriveFile().getDriveId());
        Toast.makeText(getApplicationContext(), "Created a file: " + result.getDriveFile().getDriveId(),
                   Toast.LENGTH_LONG).show();

}
};

}

Zsombor
  • 41
  • 1
  • 5

2 Answers2

1

There is an ID called Resource ID you get from DriveId.getResourceId(), see SO 21800257 that allows you to form URL of the file, something that looks like

https://docs.google.com/file/d/0B1mQU..........ZRTc5SHRlNjg/

The rest of your question should be easy to answer. It is a string so it can be saved, shown,... as such. But make sure that you form the URL string correctly. The example above is just one specific to my app. The key is still the Resource ID.

Community
  • 1
  • 1
seanpj
  • 6,735
  • 2
  • 33
  • 54
  • Where should I insert these 2 lines DriveIdResult result = Drive.DriveApi.fetchDriveId(GAC,DriveId.getResourceId()).await(); DriveId drvID = result.getDriveId(); ? I copied it into onActivityResult (quickstart app) and I get an error like: Cannot make a static reference to the non-static method getResourceId() from the type DriveId. And GAC is a string variable? – Zsombor Apr 08 '14 at 10:34
  • GAC is an instance of GoogleApiClient. Static / non-static mismatch belongs to Java ecosystem, I don't know your code so I can't help you (neither I want to). Otherwise, the answer above, states the simple fact that you can retrieve the RESOURCE ID (via getResourceId()) string that allows you to form an URL you're asking for. The URL itself comes in many flavors, but the RESOURCE ID is the variable entity that identifies the file / folder in Google Drive. The 'fetchDriveId()' is a reverse method.You pass it the RESOUCE ID and it gives you the DriveId you need in GDAA ecosystem. – seanpj Apr 08 '14 at 17:51
  • I added the code. How can I get the ResourceId of the uploaded image? Where and what I have to insert? – Zsombor Apr 25 '14 at 12:06
  • if you have time, please help me, because I`ve tried in many ways, but it didn`t worked – Zsombor Apr 30 '14 at 11:09
0

I used another method to upload a new photo to Google drive, because I also needed to OCR it. Now I can get the Id of the file easily.

//upload the file and OCR it 
File file = service.files().insert(body, mediaContent).setOcr(true).execute();

//save the id into a string      
String fileid=file.getId();
Zsombor
  • 41
  • 1
  • 5