Android Drive api下载文件

时间:2016-05-24 07:47:19

标签: android google-drive-api

我已成功使用this project在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 个答案:

答案 0 :(得分:5)

使用此代码从Google驱动器下载

您只需要传递要在SD卡上保存的driveId和文件名

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

答案 1 :(得分:0)

这对我有用:

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

答案 2 :(得分:0)

使用其扩展名保存文件。同样的事发生在我身上

例如,如果你的文件名是xyz并且没有扩展名你保存它有时会出现问题,如果你保存扩展名为xyz.pdf的文件你应该不会遇到这个问题