使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹

2023-12-14

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

我正在使用下面的代码

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

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

  1. 实施GoogleApiClient.IConnectionCallbacks

  2. 获得一个GoogleApiClient with DriveClass.API and DriveClass.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);
    }
}

Notes:

  • 在后台线程上执行此操作
  • Drive allows multiple files/folders with same name (Title)
    • 查询现有文件是否要替换
    • 查询现有文件夹,除非您确实有多个具有相同文件夹的文件夹Title
  • 中的文件夹和文件Trash除非排除,否则都是返回的查询。
  • 利用Using块和Dispose以避免泄漏
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹 的相关文章

随机推荐

  • 需要帮助,出现错误“TypeError: __init__() 需要 5 个位置参数,但给出了 6 个”

    我刚刚开始上课并理解基本概念 但是我不明白为什么它会给我这个错误 My code import pygame pygame init screen pygame display set mode 400 300 done False whi
  • 使用 AND 运算符进行 Mongoose 文本搜索

    所以我想做的是用 mongoose 到 mongoDb 进行 AND 搜索 但结果来自 OR 搜索 有这方面的设置吗 查询如下所示 exampleModel find text search searchParams score meta
  • React js Web应用程序中的溢出问题

    这是我正在使用的样式表 在移动设备和平板电脑视图中使用此功能时会出现溢出问题 但在桌面视图中则没有任何问题 任何人都可以为此提出解决方案吗 我正在开发一个reactjs web应用程序并托管在firebase中 如果我添加较少数量的技术语言
  • 如何让两个tooltip id独立关闭,并记住cookie?

    我正在尝试使用 jQuery HTML 和 CSS 制作工具提示 每个工具提示的 ID 都不同 而且效果很好 因此我可以根据需要制作任意数量的工具提示并独立设置它们的样式 我不明白的是如何在不影响其他工具提示的情况下关闭工具提示 我使用 R
  • 无限水平滚动UIScrollView

    我有一个 UIScrollView 其内容大小为 1200x480 我上面有一些图像视图 其宽度加起来为 600 当向右滚动时 我只需增加内容大小并设置偏移量 以使一切变得平滑 然后我想添加其他图像 但这并不重要现在 所以基本上 当前在视口
  • 如何在没有 Ajax Toolkit 的情况下显示加载图像直到 gridview 完全加载?

    QUESTION 谁能建议如何在 gridview 完全加载之前显示加载图像 该网格视图将在页面加载时呈现 必须有一个简单的解决方案来检测 gridview 何时加载 加载 以便可以实现加载图像和 gridview 可见性之间的简单切换 请
  • Internet Explorer 8 支持 HTML 5 吗?

    IE8 是否支持 HTML5 它在 IE8 路线图上吗 IE8 beta 2 支持 HTML5 的两个 API 跨文档消息传递 and 非 SQL 存储 IE8 beta 2没有实现HTML5解析算法或新元素 没有
  • Spark:回归模型阈值和精度

    我有逻辑回归模式 我明确地将阈值设置为 0 5 model setThreshold 0 5 我训练模型 然后我想要获得基本统计数据 精确度 召回率等 这就是我评估模型时所做的 val metrics new BinaryClassific
  • Yii 迁移,未创建表

    我是 Yii 新手 仍在学习 我正在遵循书籍教程 在这里我按照书中所写创建了一个新的迁移 yiic migrate create create issue user and assignment tables 在 safeup 中我写了这个
  • LINQ 查询查找列表中的项目是否包含在另一个列表中

    我有以下代码 List
  • Java的时差[重复]

    这个问题在这里已经有答案了 为什么下面的Java代码的输出是04 18 23而不是03 18 23 public static void main String args SimpleDateFormat sdf new SimpleDat
  • 使用 getOpenFileNames 填充 QListWidget

    在下面的示例中 我想用打开 Qdialog 的文件填充我的 QListWidget 我不明白如何添加列表中选择的文件 我应该上新课吗 如何连接 setupList 和 addFiles 这两个方法 import sys from PyQt4
  • 如何将复选框添加到 uialertview 中?

    我是 iPhone 开发新手 我想在警报视图中添加一个复选框 过去两天我正在对此警报视图进行测试 但没有得到任何有效的演示项目 我正是想要这个警报框 谁能帮我 尝试使用此代码添加复选框alertview Swift let nameFiel
  • Pandas 版本之间的 MultiIndex/Reshaping 差异

    我有一个使用以下代码的 DataFrame import pandas as pd import numpy as np index pd DatetimeIndex 2017 05 04 2017 05 05 2017 05 08 201
  • Java 套接字数组

    我正在创建服务器和客户端 java 应用程序 我想创建一个数组来存储我的套接字 我正在使用 eclipse 当我输入这一行时 Socket sockets new Socket 3 Eclipse 给我一个错误 说 资源类型 Socket
  • 从主干集合中设置 Fuelux 数据网格源

    我正在尝试从我的主干集合中设置 Fuelux 数据网格源 示例来源在这里https github com ExactTarget fuelux tree master sample 我累了就像 function root factory i
  • 如何处理 pandas 中的插补和热一编码?

    我正在尝试对我的数据集应用插补和热一种编码 我知道在应用插补时 数据的维度可能会发生变化 因此我手动处理了它 该模型运行良好 但后来我决定应用热一种编码 现在 该程序无法编译 我收到尺寸不匹配错误 test X pd get dummies
  • 如何访问 subclipse 在运行时使用的 SVNClientAdapter?

    我正在使用 Subclipse API 我想实现 ISVNNotifyListener 以便我可以了解运行时发生的 subclipse 事件 我相信我需要将我的通知侦听器实例添加 订阅 到客户端适配器将通知的侦听器集 但我不知道如何访问 S
  • 我无法初始化 Google Play 游戏服务

    项目只有这段代码 我只是遵循这个描述 访问https developers google com games services android init 创建项目并添加库 google play services lib 和 BaseGam
  • 使用 Xamarin.Android 将文件上传到谷歌驱动器文件夹

    我想使用 Xamarin Andriod 在 google 驱动器 不是默认位置 的特定文件夹内创建文件 我正在使用下面的代码 MetadataChangeSet changeSetfile new MetadataChangeSet Bu