gpt4 book ai didi

android - DriveFolder.listChildren() 未显示其所有子项

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:37 26 4
gpt4 key购买 nike

我正在制作一个适用于谷歌驱动器的应用。

我需要获取文件夹内所有文件的列表,但似乎不可能:当我调用 listFiles 方法 () 时,我无法获取 DriveFolder 内的所有文件。但不仅如此,在我得到的文件列表中,有一些我之前删除的文件。

我了解到这可能是由 google play 服务导致的同步延迟引起的,但我在我的帐户设置中选择了“立即同步”选项,因此我认为问题不是由该延迟引起的。

这就是我说的方法http://developer.android.com/reference/com/google/android/gms/drive/DriveFolder.html#listChildren(com.google.android.gms.common.api.GoogleApiClient)

这是我写的代码:

public class ServicePull extends IntentService implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener{

private GoogleApiClient mApiClient;

public static void startPull(Context context) {
Intent intent = new Intent(context, ServicePull.class);
context.startService(intent);
}

public ServicePull() {
super("ServicePull");
}

@Override
protected void onHandleIntent(Intent intent) {
mApiClient = new GoogleApiClient.Builder(this)
.addApi(Drive.API)
.addScope(Drive.SCOPE_FILE)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();

mApiClient.connect();
}



@Override
public void onConnected(Bundle bundle) {
NotificationStatus.notify(this, "On Connected", "mApiClient Connected");
DriveFolder driveFolder = Drive.DriveApi.getRootFolder(mApiClient);
driveFolder.listChildren(mApiClient).setResultCallback(rootFolderCallback);
}

@Override
public void onConnectionSuspended(int i) {
NotificationStatus.notify(this, "On Suspended", "mApiClient Suspended");
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
NotificationStatus.notify(this, "On failed", "mApiClient failed");
}

final private ResultCallback<DriveApi.MetadataBufferResult> rootFolderCallback =
new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
log("got root folder");
MetadataBuffer buffer = metadataBufferResult.getMetadataBuffer();
log("Buffer count " + buffer.getCount());
for(Metadata m : buffer){
log("Metadata name " + m.getTitle() + "(" + (m.isFolder() ? "folder" : "file") + ")");
if (m.isFolder() && m.getTitle().equals("Neewie"))
Drive.DriveApi.getFolder(mApiClient, m.getDriveId())
.listChildren(mApiClient)
.setResultCallback(fileCallback);
}
}
};

final private ResultCallback<DriveApi.MetadataBufferResult> fileCallback =
new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
log("got file children");
MetadataBuffer buffer = metadataBufferResult.getMetadataBuffer();
//for(Metadata m : buffer){
log("Buffer count " + buffer.getCount());
for(int i =0;i<buffer.getCount();i++){
Metadata m = buffer.get(i);
log(m.toString());
Drive.DriveApi.getFile(mApiClient, m.getDriveId())
.openContents(mApiClient, DriveFile.MODE_READ_ONLY,
new DriveFile.DownloadProgressListener() {
@Override
public void onProgress(long bytesDownloaded, long bytesExpected) {
// Update progress dialog with the latest progress.
int progress = (int) (bytesDownloaded * 100 / bytesExpected);
Log.wtf("TAG", String.format("Loading progress: %d percent", progress));
}
}
)
.setResultCallback(contentsCallback);
}
}
};


final private ResultCallback<DriveApi.ContentsResult> contentsCallback =
new ResultCallback<DriveApi.ContentsResult>() {
@Override
public void onResult(DriveApi.ContentsResult contentsResult) {
log("got file contents");
File file = new File("storage/emulated/0/Downtests/tessing.txt");
file.mkdirs();
try {
InputStream input = contentsResult.getContents().getInputStream();
OutputStream output = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while ((len = input.read(buf)) > 0) {
output.write(buf, 0, len);
}
input.close();
output.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}
};

private void log(String s){
Log.wtf("ServicePull", s);
}



}

显然,我创建了一个名为“Neewie”的文件夹,并在其中创建了一个文件。我有一个指向 Neewie 文件夹的 DriveFolder,但是当 listChildren 它时,我收到一个计数为 0 的 MetadataBuffer。

我需要做些什么来列出所有文件吗?gms库有问题吗?

最佳答案

重新运行您的示例需要很长时间,但我可能有几点可以帮助您领先。

首先,由于 Google Drive Android API 中还没有删除功能,您可能指的是 Web Drive 界面中的“删除”操作。状态 Metadata.isTrashed() 未正确反射(reflect)状态为 discussed here .使用 requestSync() 也无济于事。但我放弃了这个问题,因为我希望他们通过在 GDAA 中实现 DELETE 来解决它。有关 DELETE 的更多信息,请参见 here .

其次,我在我的测试环境中使用“await”版本的调用(包装在 AsyncTask 中)来进行测试。通过它要容易得多。我曾经经历过一些“奇怪”的行为,但无法查明。由 clearing the Google Play Services cache 修复.

第三,有一个Google Api Client wrapper class GooApiClnt在此代码(底部)中似乎产生了稳定的结果 - 您可以尝试一下。您可以测试“findAll”(即 DriveApi.query)版本而不是“listAll”(即 listChildren),因为它允许您预先过滤 TRASHED 状态。顺便说一句,我注意到您没有在示例中记录 Metadata.isTrashed() 状态。它可以更好地了解删除了哪些文件。但同样,它只会确认同步延迟问题。

最后一个小问题——我不知道它是否已经在 GDAA 级别上得到修复——“getMetadataBuffer”的发布/关闭。它导致我的代码中出现资源泄漏。同样,请参阅上面引用的 Github 代码,grep 'mdb.close()'。

编码愉快,好运

关于android - DriveFolder.listChildren() 未显示其所有子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22408579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com