[英]Java - Download and delete file on Google Drive
我有一个Android应用程序,有时需要在Google云端硬盘上创建和删除一些文本文件,以及下载/获取这些文件的内容以在活动中显示它。 因此,我一直在尝试寻找一种仅使用文件名来执行此操作的方法,但我似乎在查找有关如何执行操作的信息时遇到了很多问题。 而且,不是Java开发人员也不会使事情变得简单。
我设法在根文件夹中创建一个文件:
private void createFile()
{
println("CreateFileActivity > createFile");
final Task<DriveFolder> rootFolderTask = getDriveResourceClient().getRootFolder();
final Task<DriveContents> createContentsTask = getDriveResourceClient().createContents();
Tasks.whenAll(rootFolderTask, createContentsTask)
.continueWithTask(task -> {
DriveFolder parent = rootFolderTask.getResult();
DriveContents contents = createContentsTask.getResult();
OutputStream outputStream = contents.getOutputStream();
try (Writer writer = new OutputStreamWriter(outputStream))
{
writer.write("SOME_TEXT_HERE");
}
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle("MyFile.txt")
.setMimeType("text/plain")
.setStarred(true)
.build();
return getDriveResourceClient().createFile(parent, changeSet, contents);
})
.addOnSuccessListener(this,
driveFile -> {
System.out.println("File created");
Intent resultActvityIntent = new Intent(getApplicationContext(), ResultActivity.class);
startActivity(resultActvityIntent);
})
.addOnFailureListener(this, e -> {
Toast.makeText(this, "Unable to create file", Toast.LENGTH_SHORT).show();
System.out.println("Unable to create file");
Log.e(TAG, "Unable to create file", e);
Intent resultActvityIntent = new Intent(getApplicationContext(), ResultActivity.class);
startActivity(resultActvityIntent);
});
}
但是令我惊讶的是,它每次都创建一个具有相同名称的新文件,而不是覆盖它。
另外,我似乎无法仅使用文件名来删除文件或下载文件/对其内容进行分级。 我找到了很多有关如何使用文件ID删除文件的信息,我还找到了Google提供的示例,但这并不是我真正需要的。
@Override
protected void onDriveClientReady()
{
pickTextFile()
.addOnSuccessListener(this,
driveId -> deleteFile(driveId.asDriveFile()))
.addOnFailureListener(this, e -> {
Log.e(TAG, "No file selected", e);
showMessage(getString(R.string.file_not_selected));
finish();
});
}
private void deleteFile(DriveFile file)
{
// [START delete_file]
getDriveResourceClient()
.delete(file)
.addOnSuccessListener(this,
aVoid -> {
showMessage(getString(R.string.file_deleted));
finish();
})
.addOnFailureListener(this, e -> {
Log.e(TAG, "Unable to delete file", e);
showMessage(getString(R.string.delete_failed));
finish();
});
// [END delete_file]
}
关于如何执行此操作或从哪里开始寻找任何想法? 还是无法直接从应用程序内删除文件?
这就是Google Drive API的工作方式。 一切都使用文件ID。 您应该做的是一个file.list发送q参数来搜索具有正确名称和文件类型的文件。 然后,您将具有文件ID,以便能够更新文件。
Google驱动器API不会阻止您创建多个具有相同名称的文件。
遵循@DalmTo的建议,这是我删除Google云端硬盘上文件的解决方案。 下面的示例跳过垃圾桶并永久删除文件。
private static final String fileName = "MyAppsTextFile.txt";
private void deleteExistingFile()
{
println("DeleteFileActivity > deleteExistingFile");
Query query = new Query.Builder()
.addFilter(Filters.eq(SearchableField.TITLE, fileName))
.build();
Task<MetadataBuffer> queryTask = getDriveResourceClient().query(query);
queryTask.addOnSuccessListener( this,
new OnSuccessListener<MetadataBuffer>()
{
@Override
public void onSuccess(MetadataBuffer metadataBuffer)
{
System.out.println("Success. File/s found!");
for(Metadata m : metadataBuffer)
{
DriveResource driveResource = m.getDriveId().asDriveResource();
System.out.println("Deleting file " + fileName + " with DriveID m.getDriveId()");
getDriveResourceClient().delete(driveResource);
}
}
})
.addOnFailureListener(this, new OnFailureListener()
{
@Override
public void onFailure(@NonNull Exception e)
{
System.out.println("ERROR: File not found!");
}
});
}
由于线程标题为“下载并删除”,因此以下是从Google驱动器获取文件内容的代码:
private static final String fileName = "MyAppsTextFile.txt";
private void getFiles()
{
System.out.println("GetGoogleDriveFile > getFiles");
Query query = new Query.Builder()
.addFilter(Filters.eq(SearchableField.TITLE, fileName))
.build();
Task<MetadataBuffer> queryTask = getDriveResourceClient().query(query);
queryTask
.addOnSuccessListener(this,
new OnSuccessListener<MetadataBuffer>()
{
@Override
public void onSuccess(MetadataBuffer metadataBuffer)
{
System.out.println("On SUCCESS");
for( Metadata m : metadataBuffer )
{
DriveFile driveFile = m.getDriveId().asDriveFile();
getFileContents(driveFile);
}
}
})
.addOnFailureListener(this, new OnFailureListener()
{
@Override
public void onFailure(@NonNull Exception e)
{
System.out.println("On FAILURE");
}
});
}
private void getFileContents(DriveFile myFile)
{
System.out.println("GetGoogleDriveFile > getFileContents");
Task<DriveContents> openFileTask =
getDriveResourceClient().openFile(myFile, DriveFile.MODE_READ_ONLY);
openFileTask
.continueWithTask(new Continuation<DriveContents, Task<Void>>()
{
@Override
public Task<Void> then(@NonNull Task<DriveContents> task) throws Exception
{
DriveContents contents = task.getResult();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(contents.getInputStream())))
{
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null)
{
builder.append(line).append("\n");
}
userData = builder.toString();
}
System.out.println("We have the file content!");
Task<Void> discardTask = getDriveResourceClient().discardContents(contents);
return discardTask;
}
})
.addOnFailureListener(new OnFailureListener()
{
@Override
public void onFailure(@NonNull Exception e)
{
System.out.println("Unable to read file!");
}
});
}
我很确定这可以改善,但是我想这对于任何寻求解决方案的人都是一个开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.