如何在Google Drive';使用Xamarin/c#读取应用文件夹和文件内容?
我正在尝试处理apps文件夹中的文本文件 这是我的GoogleAppClient构造函数:如何在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
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());