如何在Google云端硬盘的应用程序文件夹中列出所有孩子,并使用Xamarin / c#阅读文件内容?

时间:2017-08-08 06:50:12

标签: xamarin xamarin.android google-drive-android-api

我尝试使用apps文件夹中的文本文件。

这是我的GoogleApiClient构造函数:

SELECT device_id, value FROM DATA 
WHERE device_id=2 ORDER BY ABS(value-target_value) ASC LIMIT 1

我正在联系:

googleApiClient = new GoogleApiClient.Builder(this)
   .AddApi(DriveClass.API)
   .AddScope(DriveClass.ScopeFile)
   .AddScope(DriveClass.ScopeAppfolder)
   .UseDefaultAccount()
   .AddConnectionCallbacks(this)
   .EnableAutoManage(this, this)
   .Build();

之后:

googleApiClient.Connect()

我需要列出app文件夹中的所有文件。这是我到目前为止所得到的:

OnConnected()

这给了我文件元数据。

但在那之后,我不知道如何阅读,编辑或保存新文件。它们是使用我的应用程序的先前版本(本机)创建的文本文件。

我正在关注驱动器的Google文档,但Xamarin API有很多不同,没有文档或示例。这是我使用的API https://components.xamarin.com/view/googleplayservices-drive

编辑: 以下是从指南中读取文件内容的示例:

    IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient);
    IDriveApiMetadataBufferResult result = await appFolder.ListChildrenAsync(googleApiClient);

首先,我无法在指南的任何位置找到" DriveFile文件= ..."手段。我如何获得此实例? DriveFile似乎是此API中的静态类。 我试过了:

    DriveFile file = ...
    file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null)
        .setResultCallback(contentsOpenedCallback);

这有两个问题,首先它抱怨GetFile已被弃用,但没有说明如何正确地做到这一点。其次,文件没有"打开"方法

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

Xamarin绑定库包装了Java Drive库(https://developers.google.com/drive/),因此如果您记住Binding的Java到C#转换,那么基于Android的Drive API的所有指南/示例都会起作用:

  • 获取/设置方法 - >特性
  • 字段 - >特性
  • 听众 - >事件
  • 静态嵌套类 - >嵌套类
  • 内部阶级 - >带有实例构造函数的嵌套类

因此,当驱动器项目是文件夹时,您可以通过递归使用Metadata来列出AppFolder的目录和文件。

获取目录/文件树示例:

await Task.Run(() =>
{
    async void GetFolderMetaData(IDriveFolder folder, int depth)
    {
        var folderMetaData = await folder.ListChildrenAsync(_googleApiClient);
        foreach (var driveItem in folderMetaData.MetadataBuffer)
        {
            Log.Debug(TAG, $"{(driveItem.IsFolder ? "(D)" : "(F)")}:{"".PadLeft(depth, '.')}{driveItem.Title}");
            if (driveItem.IsFolder)
                GetFolderMetaData(driveItem.DriveId.AsDriveFolder(), depth + 1);
        }
    }
    GetFolderMetaData(DriveClass.DriveApi.GetAppFolder(_googleApiClient), 0);
});

输出:

[SushiHangover.FlightAvionics] (D):AppDataFolder
[SushiHangover.FlightAvionics] (F):.FlightInstrumentationData1.json
[SushiHangover.FlightAvionics] (F):.FlightInstrumentationData2.json
[SushiHangover.FlightAvionics] (F):.FlightInstrumentationData3.json
[SushiHangover.FlightAvionics] (F):AppConfiguration.json

写一个(文本)文件示例:

using (var contentResults = await DriveClass.DriveApi.NewDriveContentsAsync(_googleApiClient))
using (var writer = new OutputStreamWriter(contentResults.DriveContents.OutputStream))
using (var changeSet = new MetadataChangeSet.Builder()
       .SetTitle("AppConfiguration.txt")
       .SetMimeType("text/plain")
       .Build())
{
    writer.Write("StackOverflow Rocks\n");
    writer.Write("StackOverflow Rocks\n");
    writer.Close();
    await DriveClass.DriveApi.GetAppFolder(_googleApiClient).CreateFileAsync(_googleApiClient, changeSet, contentResults.DriveContents);
}

注意:用IDriveFolder代替DriveClass.DriveApi.GetAppFolder将文件保存在AppFolder的子文件夹中。

读取(文本)文件示例:

注意:以下示例中的driveItem是基于现有text/plain的MetaData对象,可通过递归Drive内容(请参阅上面的获取目录/文件列表)或通过创建查询找到( Query.Builder)并通过DriveClass.DriveApi.QueryAsync执行。

var fileContexts = new StringBuilder();
using (var results = await driveItem.DriveId.AsDriveFile().OpenAsync(_googleApiClient, DriveFile.ModeReadOnly, null))
using (var inputStream = results.DriveContents.InputStream)
using (var streamReader = new StreamReader(inputStream))
{
    while (streamReader.Peek() >= 0)
        fileContexts.Append(await streamReader.ReadLineAsync());
}
Log.Debug(TAG, fileContexts.ToString());