使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹 [英] Upload file into google drive folder using Xamarin.Android

查看:40
本文介绍了使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 Xamarin.Andriod 在谷歌驱动器(不是默认位置)的特定文件夹中创建文件

I want to create file inside a specific folder in google drive ( not the default location ) using Xamarin.Andriod

我正在使用下面的代码

 MetadataChangeSet changeSetfile = new MetadataChangeSet.Builder()
                   .SetTitle("Test.jpg")
                   .SetMimeType("image/jpeg")
                   .Build();

            DriveClass.DriveApi
                   .GetRootFolder(_googleApiClient)
                    .CreateFile(_googleApiClient, changeSetfile, contentResults.DriveContents);

推荐答案

  1. 实施 GoogleApiClient.IConnectionCallbacks

使用 DriveClass.APIDriveClass.ScopeFile

GoogleApiClient 示例:

if (_googleApiClient == null) //  _googleApiClient is a class level variable
{
    _googleApiClient = new GoogleApiClient.Builder(this)
      .AddApi(DriveClass.API)
      .AddScope(DriveClass.ScopeFile)
      .AddConnectionCallbacks(this)
      .AddOnConnectionFailedListener(onConnectionFailed)
      .Build();
}
if (!_googleApiClient.IsConnected)
    _googleApiClient.Connect();

  1. 连接后,查询文件夹,根据需要创建,然后向其中写入"一个文件.

文件夹和文件示例:

var folderName = "StackOverflow";
using (var driveId = DriveClass.DriveApi.GetRootFolder(_googleApiClient))
using (var query = new QueryClass.Builder().AddFilter(Filters.And(Filters.Eq(SearchableField.Title, folderName), Filters.Eq(SearchableField.Trashed, false))).Build())
using (var metaBufferResult = await driveId.QueryChildrenAsync(_googleApiClient, query))
{
    if (metaBufferResult.Status.IsSuccess)
    {
        DriveId folderId = null;
        foreach (var metaData in metaBufferResult.MetadataBuffer)
        {
            if (metaData.IsFolder && metaData.Title == folderName)
            {
                folderId = metaData.DriveId;
                break;
            }
        }

        IDriveFolder driveFolder = null;
        switch (folderId)
        {
            case null: // if folder not found, create it and fall through to default
                using (var folderChangeSet = new MetadataChangeSet.Builder().SetTitle(folderName).Build())
                using (var folderResult = await driveId.CreateFolderAsync(_googleApiClient, folderChangeSet))
                {
                    if (!folderResult.Status.IsSuccess)
                    {
                        Log.Error(TAG, folderResult.Status.StatusMessage);
                        break;
                    }
                    driveFolder = folderResult.DriveFolder;
                }
                goto default;
            default:
                driveFolder = driveFolder ?? folderId.AsDriveFolder();

                // create your file in the IDriveFolder obtained, 
                using (var contentResults = await DriveClass.DriveApi.NewDriveContentsAsync(_googleApiClient))
                {
                    if (contentResults.Status.IsSuccess)
                    {
                        using (var writer = new OutputStreamWriter(contentResults.DriveContents.OutputStream))
                        {
                            writer.Write("StackOverflow Rocks");
                            using (var changeSet = new MetadataChangeSet.Builder()
                                .SetTitle("StackOverflow Rocks")
                                .SetStarred(true)
                                .SetMimeType("text/plain")
                                .Build())
                            using (var driveFileResult = await driveFolder.CreateFileAsync(_googleApiClient, changeSet, contentResults.DriveContents))
                            {
                                if (driveFileResult.Status.IsSuccess)
                                    Log.Debug(TAG, "File created, open https://drive.google.com to review it");
                                else
                                    Log.Error(TAG, driveFileResult.Status.StatusMessage);
                            }
                        }
                    }
                }
                driveFolder.Dispose();
                break;
        }
        folderId?.Dispose();
    }
    else
    {
        Log.Error(TAG, metaBufferResult.Status.StatusMessage);
    }
}

注意事项:

  • 在后台线程中执行此操作
  • Drive 允许多个文件/文件夹具有相同的名称(Title)
    • 如果要替换现有文件,请查询现有文件
    • 查询现有文件夹,除非您确实有多个具有相同Title
    • 的文件夹

    这篇关于使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆