2015-01-31 7 views
10

Ich möchte mehrere Bilder senden, die in meinem internen Speicher vorhanden sind und wenn ich diesen Ordner auswähle, möchte ich diesen Ordner in Google Drive hochladen. Ich habe dieses Google-Laufwerk api versucht, für android https://developers.google.com/drive/android/create-file und ich habe den Code unten verwendet, aber es zeigt einige Fehler in getGoogleApiClientWie zu senden mehrere Bilder, die im Ordner zum Google Drive in Android programmatisch vorhanden sind?

der Code

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 
     } 
    } 
} 

ist es eine Annäherung Bilder zu senden oder gmail fahren ?

+0

"Es zeigt einen Fehler": Details bitte! – Henry

+0

hier zeigt es Fehler .build (getGoogleApiClient()); Es zeigt, dass getGoogleApiClient nicht verfügbar ist und ich kann kein Objekt für GoogleApiClient erstellen, um Build zu übergeben – Hanuman

Antwort

3

Ich kann Ihnen nicht den genauen Code geben, der das tut, was Sie brauchen, aber Sie können versuchen, the code I use for testing Google Drive Android API (GDAA) zu ändern. Es erstellt Ordner und lädt Dateien auf Google Drive hoch. Es liegt an Ihnen, wenn Sie den Geschmack REST oder GDAA wählen, jeder hat seine spezifischen Vorteile.

Dies deckt jedoch nur die Hälfte Ihrer Frage. Das Auswählen und Aufzählen von Dateien auf Ihrem Android-Gerät sollte an anderer Stelle behandelt werden.

UPDATE: (pro Franks Kommentar unten)

Das Beispiel, das ich oben erwähnt würden Sie eine vollständige Lösung von Grund auf neu geben, aber lassen Sie uns die Punkte Ihrer Frage ansprechen konnte ich entziffern:

Die Hürde 'ein Fehler' ist eine Methode, die GoogleApiClient Objekt vor der Code-Sequenz initialisiert zurückgibt. aussehen würde so etwas wie:

GoogleApiClient mGAC = new GoogleApiClient.Builder(appContext) 
    .addApi(Drive.API).addScope(Drive.SCOPE_FILE) 
    .addConnectionCallbacks(callerContext) 
    .addOnConnectionFailedListener(callerContext) 
    .build(); 

Wenn Sie diese ausgeräumt haben, nehmen wir an, Ihre Ordner durch ein java.io.File Objekt dargestellt wird. Hier ist der Code, der:

1/listet die Dateien in Ihnen lokalen Ordner
2/setzt den Namen, den Inhalt und MIME-Typ jeder Datei (mit jpeg der Einfachheit halber hier).
3/uploads jede Datei in den Stammordner von Google
(die create() Methode Thread ausgeführt off-UI muss) fahren

// 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; 
} 

Nadeln der Code hier zu sagen, direkt aus dem GDAA wrapper here genommen wird (am Anfang erwähnt), also wenn Sie irgendwelche Verweise auflösen müssen, müssen Sie den Code dort nachschlagen.

Viel Glück

Verwandte Themen