Android Drive API Скачать файл

Я успешно использую этот проект для создания или изменения файла на Google Диске. Теперь мне нужно загрузить файл во внешнюю память устройства. Я могу прочитать содержимое файла и сохранить его. Но когда я пытаюсь открыть его на рабочем столе, файл поврежден.

    @Override
    protected Void doInBackground(Void... params) {
        mBusy = true;
         ArrayList<ContentValues> cvs = GDAA.searchDB(UT.FILE_NAME);
                if (cvs != null) for (ContentValues cv : cvs) {
                    String gdid = cv.getAsString(UT.GDID);
                    System.out.println("ID..... " + gdid);
                     byte[] buf = GDAA.read(gdid);
                     String str = buf == null ? "" : new String(buf);
                     File fl = UT.str2File(str, "myfile.db");


                        }
    ----------------------------------------------
    static File str2File(String str, String name) {
    if (str == null) return null;
    byte[] buf = str.getBytes();

    File fl = new File(Environment.getExternalStorageDirectory(), name);

    if (fl == null) return null;
    BufferedOutputStream bs = null;
    try {
      bs = new BufferedOutputStream(new FileOutputStream(fl));
      bs.write(buf);
    } catch (Exception e) { le(e); }
    finally {
      if (bs != null) try {
        bs.close();
      } catch (Exception e) { le(e); }
    }
    return fl;
  }

    ----------------------------------------------
    static byte[] read(String id) {
        byte[] buf = null;
        if (mGAC != null && mGAC.isConnected() && id != null) try {
            DriveFile df = Drive.DriveApi.getFile(mGAC, DriveId.decodeFromString(id));
            DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await();
            if ((rslt != null) && rslt.getStatus().isSuccess()) {
                DriveContents cont = rslt.getDriveContents();
                buf = UT.is2Bytes(cont.getInputStream());
                cont.discard(mGAC);    // or cont.commit();  they are equiv if READONLY
            }
        } catch (Exception e) {
            UT.le(e);
        }
        return buf;
    }

3 ответа

Решение

Используйте этот код для загрузки с Google Drive

вам просто нужно передать идентификатор диска и имя файла, который вы хотите сохранить на SD-карте

 private void DownloadFile(final DriveId driveId, final File filename) {
        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                if (!filename.exists()) {
                    try {
                        filename.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            protected void onPostExecute(Boolean result) {
                super.onPostExecute(result);

            }

            @Override
            protected Boolean doInBackground(Void... params) {
                DriveFile file = Drive.DriveApi.getFile(
                        GapiClient, driveId);
                file.getMetadata(GapiClient)
                        .setResultCallback(metadataRetrievedCallback);
                DriveApi.DriveContentsResult driveContentsResult = file.open(
                        GapiClient,
                        DriveFile.MODE_READ_ONLY, null).await();
                DriveContents driveContents = driveContentsResult
                        .getDriveContents();
                InputStream inputstream = driveContents.getInputStream();

                try {
                    FileOutputStream fileOutput = new FileOutputStream(filename);

                    byte[] buffer = new byte[1024];
                    int bufferLength = 0;
                    while ((bufferLength = inputstream.read(buffer)) > 0) {
                        fileOutput.write(buffer, 0, bufferLength);
                    }
                    fileOutput.close();
                    inputstream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return true;
            }

        };
        task.execute();
    }

    private ResultCallback<MetadataResult> metadataRetrievedCallback = new ResultCallback<MetadataResult>() {
        @Override
        public void onResult(MetadataResult result) {
            if (!result.getStatus().isSuccess()) {
                return;
            }
            metadata = result.getMetadata();
        }
    };

Сохранить файл с его расширением. то же самое случилось со мной

Например, если имя вашего файла - xyz, и вы сохраняете его без расширения, иногда что-то идет не так, если вы сохраняете файл с расширением, скажем, xyz.pdf, вы не должны сталкиваться с этой проблемой.

Это работает для меня:

 @Override
    protected String doInBackground(String... params) {
        try {
            //connecting to url
            URL u = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            if (!rootDir.exists()) {
                rootDir.mkdirs();
            }

            //lenghtOfFile is used for calculating download progress
            int lenghtOfFile = c.getContentLength();

            //this is where the file will be seen after the download
            FileOutputStream f = new FileOutputStream(new File(rootDir, fileName));
            //file input is from the url
            InputStream in = c.getInputStream();


            //here’s the download code
            byte[] buffer = new byte[1024];
            int len1 = 0;
            long total = 0;

            while ((len1 = in.read(buffer)) > 0) {
                total += len1; //total = total + len1
                f.write(buffer, 0, len1);
            }
            f.close();

        } catch (Exception e) {
            Log.d(LOG_TAG, e.getMessage());

        }

        return null;
    }
Другие вопросы по тегам