我已成功使用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;
}
答案 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的文件你应该不会遇到这个问题