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