wake-up-neo.com

Android Öffnen und Speichern von Dateien in / aus dem Google Drive SDK

Ich habe die letzten sechs Stunden damit verbracht, Dokumente von Google zu überfluten, und weiß immer noch nicht, wie ich damit anfangen soll. Ich möchte es nur so gestalten, dass meine vorhandene Android App Dateien von Google Drive lesen, neue Dateien auf Google Drive hochladen und vorhandene Dateien auf Google Drive bearbeiten kann.

Ich habe gelesen, dass Drive SDK v2 ausschließlich darauf ausgerichtet war, die Verwendung für Android -Entwickler (und für Entwickler von Mobilgeräten im Allgemeinen) zu vereinfachen, und es scheint dennoch so gut wie nichts in ihrer Dokumentation zu geben.

Im Idealfall möchte ich jemanden bitten, auf eine anständige Dokumentation, ein Beispiel oder ein Tutorial zu verweisen, das dies beschreibt (denken Sie daran, dass ich Android verwende. Er hat viele Informationen zur Verwendung von Drive mit der Google App Engine; I habe es mir schon angeschaut und ich habe keine Ahnung, wie ich davon zu einer Android App wechseln soll.)

Ich muss wissen, welche Bibliotheken ich herunterladen und meinem Projekt hinzufügen muss, was ich meinem Manifest hinzufügen muss und wie ich letztendlich eine Liste von Dateien von Google Drive abrufen, eine herunterladen und dann eine geänderte Version hochladen kann.

Idealerweise möchte ich, dass Konten automatisch verarbeitet werden, so wie es die offizielle Google Drive-App tut.

57
ArtOfWarfare

Bearbeiten: Claudio Cherubino sagt, dass Google Play Services jetzt verfügbar ist und diesen Vorgang erheblich erleichtern wird. Es ist jedoch kein Beispielcode verfügbar (er sagt jedoch, dass er bald verfügbar sein wird. Sie sagten, dass Google Play Services vor 4 Monaten "bald verfügbar" war. Es besteht also eine gute Chance, dass diese Antwort weiterhin das einzige vollständig funktionierende Beispiel für den Zugriff auf ist Google Drive aus Ihrer Android -Anwendung in 2013)

Edit 2X: Sieht so aus, als hätte ich ungefähr einen Monat Verspätung, als ich sagte, dass Google bis zum nächsten Jahr kein funktionierendes Beispiel haben würde. Der offizielle Leitfaden von Google ist hier zu finden:

https://developers.google.com/drive/quickstart-Android

Ich habe ihre Methoden noch nicht getestet, daher ist es möglich, dass meine Lösungen ab September 2012 (siehe unten) immer noch die besten sind:

Google Play Services ist hierfür NICHT ERFORDERLICH. Es ist ein Schmerz im Hintern, und ich habe mehr als 50 Stunden (Bearbeitungszeit: über 100 Stunden) damit verbracht, alles herauszufinden, aber hier ist eine Menge von Dingen, die es helfen werden, zu wissen:

DIE BIBLIOTHEKEN

Für die Online-Dienste von Google benötigen Sie im Allgemeinen die folgenden Bibliotheken in Ihrem Projekt: ( Anleitung und Download-Link )

  • google-api-client-1.11.0-beta.jar
  • google-api-client-Android-1.11.0-beta.jar
  • google-http-client-1.11.0-beta.jar
  • google-http-client-Android-1.11.0-beta.jar
  • google-http-client-jackson-1.11.0-beta.jar
  • google-oauth-client-1.11.0-beta.jar
  • guava-11.0.1.jar
  • jackson-core-asl-1.9.9.jar
  • jsr305-1.3.9.jar

Insbesondere für Google Drive benötigen Sie Folgendes:

  • google-api-services-drive-v2-rev9-1.8.0-beta.jar ( Download-Link )

KONSOLE EINRICHTEN

Wechseln Sie als Nächstes zu Google Console . Mach ein neues Projekt. Unter Dienste müssen Sie zwei Dinge aktivieren: DRIVE API und DRIVE SDK ! Sie sind getrennt, eine schaltet die andere nicht automatisch ein, und SIE MÜSSEN BEIDE EINSCHALTEN! (Es hat mindestens 20 Stunden meiner Zeit gekostet, dies herauszufinden allein.)

Wechseln Sie in der Konsole zu API Access. Erstellen Sie einen Client, machen Sie ihn zu einer Android App. Geben Sie ihm Ihre Bundle-ID. Ich denke nicht, dass die Fingerabdrucksache wirklich wichtig ist, da ich ziemlich sicher bin, dass ich den falschen verwendet habe, aber versuchen Sie es trotzdem richtig zu machen (Google stellt Anweisungen dafür zur Verfügung.)

Es wird eine Client-ID generiert. Das wirst du brauchen. Halten Sie daran fest.

Bearbeiten: Mir wurde gesagt, dass ich mich irre und dass Sie nur Drive API aktivieren müssen, Drive SDK überhaupt nicht aktiviert sein muss und dass Sie nur den Simple API Key verwenden müssen, nicht festgelegt etwas für Android. Ich untersuche das gerade und werde diese Antwort wahrscheinlich in ein paar Minuten bearbeiten, wenn ich es herausfinde ...

THE Android CODE - Einrichten und Hochladen

Holen Sie sich zuerst ein Authentifizierungs-Token:

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

Als nächstes muss OnTokenAcquired () wie folgt eingerichtet werden:

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", an ordinary Java.io.File you'd like to upload. Make it using a FileWriter or something, that's really outside the scope of this answer.)
            new Thread(new Runnable() {
                public void run() {
                    try {
                        com.google.api.services.drive.model.File file = drive.files().insert(body, mediaContent).execute();
                        alreadyTriedAgain = false; // Global boolean to make sure you don't repeatedly try too many times when the server is down or your code is faulty... they'll block requests until the next day if you make 10 bad requests, I found.
                    } 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...
        }
    }
}

THE Android CODE - Herunterladen

private Java.io.File downloadGFileToJFolder(Drive drive, String token, File gFile, Java.io.File jFolder) throws IOException {
    if (gFile.getDownloadUrl() != null && gFile.getDownloadUrl().length() > 0 ) {
        if (jFolder == null) {
            jFolder = Environment.getExternalStorageDirectory();
            jFolder.mkdirs();
        }
        try {

            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(gFile.getDownloadUrl());
            get.setHeader("Authorization", "Bearer " + token);
            HttpResponse response = client.execute(get);

            InputStream inputStream = response.getEntity().getContent();
            jFolder.mkdirs();
            Java.io.File jFile = new Java.io.File(jFolder.getAbsolutePath() + "/" + getGFileName(gFile)); // getGFileName() is my own method... it just grabs originalFilename if it exists or title if it doesn't.
            FileOutputStream fileStream = new FileOutputStream(jFile);
            byte buffer[] = new byte[1024];
            int length;
            while ((length=inputStream.read(buffer))>0) {
                fileStream.write(buffer, 0, length);
            }
            fileStream.close();
            inputStream.close();
            return jFile;
        } catch (IOException e) {        
            // Handle IOExceptions here...
            return null;
        }
    } else {
        // Handle the case where the file on Google Drive has no length here.
        return null;
    }
}

Eine letzte Sache ... Wenn diese Absicht verworfen wird, müssen Sie sie behandeln, wenn sie mit einem Ergebnis zurückkehrt.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 3025) {
        switch (resultCode) {
            case RESULT_OK:
                AccountManager am = AccountManager.get(activity);
                am.getAuthToken(Same as the other two times... it should work this time though, because now the user is actually logged in.)
                break;
            case RESULT_CANCELED:
                // This probably means the user refused to log in. Explain to them why they need to log in.
                break;
            default:
                // This isn't expected... maybe just log whatever code was returned.
                break;
        }
    } else {
        // Your application has other intents that it fires off besides the one for Drive's log in if it ever reaches this spot. Handle it here however you'd like.
    }
}

THE Android CODE - Aktualisierung

Zwei kurze Hinweise zum Aktualisieren des letzten Änderungsdatums einer Datei in Google Drive:

  1. Sie müssen eine vollständig initialisierte DateTime angeben. Andernfalls erhalten Sie von Google Drive die Antwort "Bad Request".
  2. Sie müssen sowohl setModifiedDate () in der Datei von Google Drive als auch setSetModifiedDate (true) in der Aktualisierungsanforderung selbst verwenden. (Ein lustiger Name, oder? "SetSet [...]", auf keinen Fall könnten die Leute diesen falsch eingeben ...)

Hier ist ein kurzer Beispielcode, der zeigt, wie ein Update durchgeführt wird, einschließlich der Aktualisierung der Dateizeit:

public void updateGFileFromJFile(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();
}

DAS MANIFEST

Sie benötigen die folgenden Berechtigungen: GET_ACCOUNTS, USE_CREDENTIALS, MANAGE_ACCOUNTS, INTERNET, und es besteht eine gute Chance, dass Sie auch WRITE_EXTERNAL_STORAGE benötigen, je nachdem, wo Sie die lokalen Kopien Ihrer Dateien speichern möchten.

IHR GEBAUTES ZIEL

Klicken Sie mit der rechten Maustaste auf Ihr Projekt, rufen Sie dessen Eigenschaften auf und ändern Sie unter Android das Erstellungsziel in Google APIs, falls erforderlich. Wenn diese nicht vorhanden sind, laden Sie sie von der Android Download-Manager.

Wenn Sie auf einem Emulator testen, stellen Sie sicher, dass es sich bei dem Ziel um Google-APIs handelt, nicht um generisches Android.

Auf Ihrem Testgerät muss ein Google-Konto eingerichtet sein. Der geschriebene Code verwendet automatisch das erste gefundene Google-Konto (das ist die [0].) IDK, wenn Sie die Google Drive-App heruntergeladen haben müssen, damit dies funktioniert. Ich habe API Level 15 verwendet und weiß nicht, wie weit dieser Code zurückreicht.

DER REST

Das Obige sollte Ihnen den Einstieg erleichtern und hoffentlich können Sie Ihren Weg von dort aus finden ... ehrlich, das ist ungefähr so ​​weit, wie ich es bisher geschafft habe. Ich hoffe, das hilft vielen Menschen und spart ihnen viel Zeit. Ich bin mir ziemlich sicher, dass ich gerade den umfassendsten Einrichtungsleitfaden für die Einrichtung einer Android App zur Verwendung von Google Drive geschrieben habe. Schande, dass Google das erforderliche Material auf mindestens 6 verschiedene Seiten verteilt hat die überhaupt nicht miteinander verbunden sind.

78
ArtOfWarfare

Es ist 2015, die Dinge haben sich geändert!

Holen Sie sich die 'Drive API für Android' mit gradle:

compile 'com.google.Android.gms:play-services-drive:7.8.0'

Es gibt einige neue Dokumente (obwohl IMO immer noch nicht so gut gelaunt):

https://developers.google.com/drive/web/quickstart/Android

Und für diejenigen, die vor der Höhle stehen ... das größte Problem, auf das ich bisher gestoßen bin, ist, dass es absolut keine Möglichkeit gibt, dauerhaft gelöschte Ordner von normalen Ordnern zu unterscheiden ... Sie können sie finden, Sie können Ordner erstellen und Dateien in ihnen, nur das Schreiben in die Datei DriveContents wird immer fehlschlagen.

4
straya

In diesem Video von Google I/O erfahren Sie, wie Sie Ihre Android App in Drive integrieren:

http://www.youtube.com/watch?v=xRGyzqD-vRg

Beachten Sie, dass das, was Sie im Video sehen, auf Google Play Services basiert, die noch nicht für die breite Öffentlichkeit zugänglich sind:

https://developers.google.com/Android/google-play-services/

4

Schauen Sie sich Googles DrEdit-Beispiel an, das einen Ordner mit dem Namen Android/ Enthält. Kopiere es, folge dem readme und es sollte funktionieren (funktioniert bei mir auf einem Android Emulator mit KitKat).

.

P.S

Entschuldigung, dass Sie dies wiederbelebt haben, aber das neue Google Drive Android API unterstützt nicht den vollständigen Laufwerkszugriff, nur drive.file Und drive.appdataBerechtigungsbereiche . Wenn Sie also vollen Zugriff benötigen, müssen Sie zu dem guten alten dem Java-Client der Google API (den das DrEdit-Beispiel verwendet) zurückkehren.

2
woojoo666