Imansible scaricare il file creato dalla mia app su Google Drive, ma è ansible get i metadati di quel file

Ho seguito tutti i passaggi menzionati nel google drive sdk. Ho creato un'applicazione di esempio sul mio dispositivo (android, fagiolo di gelatina in esecuzione) e sono in grado di caricare un file per guidare. Quando provo a scaricare lo stesso file, sono in grado di get i meta dati come fileID, fileTitle, fileDownloadURL ecc, ma non sono in grado di scaricare il contenuto. Ottengo 401 Errore non autorizzato.

La mia app AUTH SCOPE è AUTH_TOKEN_TYPE = "oauth2: https://www.googleapis.com/auth/drive.file ";

  • Android come creare una vista simile in forma circolare con immagini e visualizzazione di text
  • Query SQLite in Android per conteggiare righe
  • Invio e ricezione di file sulla presa
  • Allineamento multiplo in TextView?
  • Android: sposta la camera quando il button è stato cliccato
  • Il collegamento dovrebbe essere aperto nella stessa visualizzazione web in Android
  • Sto facendo quanto segue per get il Token OAUTH:

    AccountManager am = AccountManager.get(this); Bundle options = new Bundle(); am.getAuthToken( mAccount, AUTH_TOKEN_TYPE, options, this, new OnTokenAcquired(), new Handler(){ @Override public void handleMessage(Message msg) { invadiateToken(); super.handleMessage(msg); } }); 

    In base al token questo è come build l'object Drive

     Drive buildService(final String 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(API_KEY); driveRequest.setOauthToken(AuthToken); } }); return b.build(); } 

    Posso caricare il file utilizzando il seguente codice:

     private void uploadLocalFileToDrive(Drive service) throws IOException{ // File's metadata. String mimeType = "text/plain"; File body = new File(); body.setTitle("myText.txt"); body.setDescription("sample app by varun"); body.setMimeType("text/plain"); // File's content. java.io.File fileContent = new java.io.File(mInternalFilePath); FileContent mediaContent = new FileContent(mimeType, fileContent); service.files().insert(body, mediaContent).execute(); } 

    Durante il tentativo di scaricare lo stesso file caricato da questa applicazione, riceve un errore non autorizzato 401 a questa row HttpResponse resp = service.getRequestFactory().buildGetRequest(url).execute() dal seguente snippet di codice

     private void downloadFileFromDrive(Drive service) throws IOException { Files.List request; request = service.files().list(); do { FileList files = request.execute(); for(File file:files.getItems()){ String fieldId = file.getId(); String title = file.getTitle(); Log.e("MS", "MSV:: Title-->"+title+" FieldID-->"+fieldId+" DownloadURL-->"+file.getDownloadUrl()); if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0 ) { GenericUrl url = new GenericUrl(file.getDownloadUrl()); HttpResponse resp = service.getRequestFactory().buildGetRequest(url).execute(); InputStream isd = resp.getContent(); Log.e("MS", "MSV:: FileOutPutStream--->"+getFilesDir().getAbsolutePath()+"/downloaded.txt"); } else { Log.e("MS", "MSV:: downloadURL for this file is null"); } } request.setPageToken(files.getNextPageToken()); } while (request.getPageToken()!=null && request.getPageToken().length()>0); } 

    Qualcuno può aiutarmi fuori e lasciami sapere cosa sto facendo male ???

  • Imansible afferrare i progressi sul caricamento di file http POST (Android)
  • impostare l'attenzione su qualsiasi elemento di listview in android
  • Google IAP restituisce un token di acquisto breve per la verifica
  • exception null pointer sul metodo di interface chiamante implementato in un'altra class
  • Android: Come get l'id dell'elemento di filatura utilizzando ArrayAdapter
  • Apri il file nella directory di cache con ACTION_VIEW
  • 3 Solutions collect form web for “Imansible scaricare il file creato dalla mia app su Google Drive, ma è ansible get i metadati di quel file”

    Questo è un problema noto che verrà risolto con il rilascio delle API di Google Play Services .

    Poiché la tua applicazione è autorizzata per l'ambito https://www.googleapis.com/auth/drive.file e l'endpoint di download non support il parametro ?key= query, non c'è modo per il nostro server di sapere quale progetto sta inviando la richiesta (per assicurarsi che l'applicazione abbia l'authorization per leggere il contenuto di questo file).

    Nel frattempo, l'unica soluzione che posso raccomandare è utilizzare l'ambito generale: https://www.googleapis.com/auth/drive . Utilizza solo questo durante lo sviluppo dell'applicazione e l'attesa che vengano pubblicati i servizi di Google Play.

    Per ulteriori informazioni su come potrai utilizzare le nuove API di authorization in Android, potresti essere interessato a quei 2 colloqui di Google I / O: creare applicazioni Android che utilizzano le API Web e la scrittura di applicazioni efficienti per l'unità Android

    Ho risposto a questa domanda, e tutte le questioni relative a Drive su Android, qui:

    Android Apri e salva file su / da SDK di Google Drive

    In quella risposta ho postato codice per un metodo che ho usato per scaricare i file da Google Drive (se il seguente codice di per sé non è chiaro, guarda la risposta completa a cui ho collegato).

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

    Non credo che abbiamo bisogno di un Token di accesso per scaricare un file. Ho avuto lo stesso problema, e questo ha funzionato:

     private class DownloadFile extends AsyncTask<Void, Long, Boolean> { private com.google.api.services.drive.model.File driveFile; private java.io.File file; public DownloadFile(File driveFile) { this.driveFile = driveFile; } @Override protected Boolean doInBackground(Void... params) { if (driveFile.getDownloadUrl() != null && driveFile.getDownloadUrl().length() > 0) { try { HttpResponse resp = mDriveService .getRequestFactory() .buildGetRequest( new GenericUrl(driveFile.getDownloadUrl())) .execute(); OutputStream os = new FileOutputStream(file); CopyStream(resp.getContent(), os); os.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } } @Override protected void onPostExecute(Boolean result) { //use the file } } public static void CopyStream(InputStream is, OutputStream os) { final int buffer_size = 1024; try { byte[] bytes = new byte[buffer_size]; for (;;) { int count = is.read(bytes, 0, buffer_size); if (count == -1) break; os.write(bytes, 0, count); } } catch (Exception ex) { } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.