Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Google Drive';使用Xamarin/c#读取应用文件夹和文件内容?_Xamarin_Xamarin.android_Google Drive Android Api - Fatal编程技术网

如何在Google Drive';使用Xamarin/c#读取应用文件夹和文件内容?

如何在Google Drive';使用Xamarin/c#读取应用文件夹和文件内容?,xamarin,xamarin.android,google-drive-android-api,Xamarin,Xamarin.android,Google Drive Android Api,我正在尝试处理apps文件夹中的文本文件 这是我的GoogleAppClient构造函数: googleApiClient = new GoogleApiClient.Builder(this) .AddApi(DriveClass.API) .AddScope(DriveClass.ScopeFile) .AddScope(DriveClass.ScopeAppfolder) .UseDefaultAccount() .AddConnectionCallbacks

我正在尝试处理apps文件夹中的文本文件

这是我的GoogleAppClient构造函数:

googleApiClient = new GoogleApiClient.Builder(this)
   .AddApi(DriveClass.API)
   .AddScope(DriveClass.ScopeFile)
   .AddScope(DriveClass.ScopeAppfolder)
   .UseDefaultAccount()
   .AddConnectionCallbacks(this)
   .EnableAutoManage(this, this)
   .Build();
我正在联系:

googleApiClient.Connect()
及之后:

OnConnected()
我需要列出应用程序文件夹中的所有文件。以下是我目前得到的信息:

    IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient);
    IDriveApiMetadataBufferResult result = await appFolder.ListChildrenAsync(googleApiClient);
这给了我文件元数据

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

我正在关注google docs for drive,但Xamarin API有很大不同,没有文档或示例。以下是我正在使用的API:

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

    DriveFile file = ...
    file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null)
        .setResultCallback(contentsOpenedCallback);
首先,我在指南中找不到“DriveFile=…”的含义。如何获取此实例?DriveFile在这个API中似乎是一个静态类。 我试过:

这有两个问题,首先,它抱怨GetFile已被弃用,但没有说明如何正确执行。其次,该文件没有“open”方法


非常感谢您的帮助。

Xamarin绑定库包装了Java驱动器库(),因此,如果您记住绑定的Java到C的转换,那么基于Android的驱动器API的所有指南/示例都可以使用:

  • 获取/设置方法->属性
  • 字段->属性
  • 侦听器->事件
  • 静态嵌套类->嵌套类
  • 内部类->带有实例构造函数的嵌套类
因此,当驱动器项是文件夹时,可以通过递归使用
元数据
列出AppFolder的目录和文件

获取目录/文件树示例: 输出: 编写(文本)文件示例: 注意:将
DriveClass.DriveApi.GetAppFolder
替换为
IDriveFolder
,以将文件保存在AppFolder的子文件夹中

阅读(文本)文件示例: 注意:
driveItem
在下面的示例中是一个现有的基于
text/plain
的元数据对象,通过递归驱动器内容(参见上面的获取目录/文件列表)或创建查询(
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());

谢谢我正在使用Xamarin for Android,我以前的版本是本机版本,所以我遵循Java指南。我走了这么远。我设法得到了文件元数据,但这是我所能得到的。API不工作。我将用一个例子来编辑这个问题。谢谢!我在找这个东西。我想API的主要问题是快速帮助信息是错误的。我习惯于键入每个变量,我避免使用“var”,这就是为什么我永远无法编译。说明返回类型从来都不是正确的。给我点时间试试。再次感谢。效果很好,谢谢!但如果你不介意的话,我还有一个问题。API描述说,我可以保存我的文件,即使它没有连接,一旦连接,它将更新它们。但如果断开连接,我就无法处理GoogleapClient。怎么样?@Dpedrinha您实际上需要一个“连接”的GoogleAppClient。现在,这并不意味着一台设备实际上有任何可用的wifi/celluar数据,但您仍然可以构建一个GoogleapClient对象并运行
Connect()
,如果该设备之前已经过授权并在先前的连接中同步,GoogleapClient将实际“连接”并调用
OnConnected
侦听器,则
IsConnected
属性将为true。@Dpedrinha现在您有了一个有效的GoogleAppClient对象,可以在驱动器调用中使用,并且可以读取任何现有文件。当您的设备实际获得网络连接时,将同步新文件或对现有缓存文件的更改。
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);
}
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());