我正在制作一个适用于谷歌驱动器的应用程序。
我需要获取文件夹中所有文件的列表,但似乎不可能:当我调用 listFiles 方法()时,我无法获取 DriveFolder 中的所有文件。但不仅如此,在我得到的文件列表中,还有一些我之前删除的文件。
我已经读到这可能是由于 google play 服务导致的同步延迟引起的,但我在帐户设置中选择了“立即同步”选项,所以我认为问题不是由该延迟引起的。
这是我写的代码:
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 库有问题吗?