我尝试使用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已被弃用,但没有说明如何正确地做到这一点。其次,文件没有"打开"方法
感谢任何帮助。
答案 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());