使用 Android 将文本文件上传到 Google Drive

2024-05-06

编辑:我已将文本设置为字符串,如下所示:

字符串文本 = (“你好!”);

我想将其转换为纯文本文件,然后上传到 Google 云端硬盘文件夹。我已经尝试过下面的代码,但它不完整,所以我无法说出出现了什么错误。

我正在使用 Google Drive“快速启动”演示,并尝试根据我的需要对其进行定制。关联:https://github.com/googledrive/android-quickstart https://github.com/googledrive/android-quickstart

驱动程序类别:

public class UploadDrive extends Activity implements ConnectionCallbacks,OnConnectionFailedListener {

 private static final String TAG = "androiddrivequickstart";
 private static final int REQUEST_CODE_CAPTURE_IMAGE = 1;
 private static final int REQUEST_CODE_CREATOR = 2;
 private static final int REQUEST_CODE_RESOLUTION = 3;
 private GoogleApiClient mGoogleApiClient;
 private Bitmap mBitmapToSave;


 private void saveFileToDrive() {
    // Start by creating a new contents, and setting a callback.
    Log.i(TAG, "Creating new contents.");
    //How to call? Can i use File from java.io?
    final Bitmap image = mBitmapToSave;
    Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(new ResultCallback<DriveContentsResult>() {

        @Override
        public void onResult(DriveContentsResult result) {
            // If the operation was not successful, we cannot do anything
            // and must
            // fail.
            if (!result.getStatus().isSuccess()) {
                Log.i(TAG, "Failed to create new contents.");
                return;
            }
            // Otherwise, we can write our data to the new contents.
            Log.i(TAG, "New contents created.");
            // Get an output stream for the contents.

            OutputStream outputStream = result.getDriveContents().getOutputStream();

            // Write the bitmap data from it.
            ByteArrayOutputStream textFile = new ByteArrayOutputStream();
            //image.compress(Bitmap.CompressFormat.PNG, 100, textFile);
            try {
                outputStream.write(textFile.toByteArray());
            } catch (IOException e1) {
                Log.i(TAG, "Unable to write file contents.");
            }
            // Create the initial metadata - MIME type and title.
            // Note that the user will be able to change the title later.
            MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
                    .setMimeType("text/plain").setTitle("Log: test.txt").build();
            // Create an intent for the file chooser, and start it.
            IntentSender intentSender = Drive.DriveApi
                    .newCreateFileActivityBuilder()
                    .setInitialMetadata(metadataChangeSet)
                    .setInitialDriveContents(result.getDriveContents())
                    .build(mGoogleApiClient);
            try {
                startIntentSenderForResult(
                        intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0);
            } catch (SendIntentException e) {
                Log.i(TAG, "Failed to launch file chooser.");
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    if (mGoogleApiClient == null) {
        // Create the API client and bind it to an instance variable.
        // We use this instance as the callback for connection and connection
        // failures.
        // Since no account name is passed, the user is prompted to choose.
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }
    // Connect the client. Once connected, the camera is launched.
    mGoogleApiClient.connect();
}

@Override
protected void onPause() {
    if (mGoogleApiClient != null) {
        mGoogleApiClient.disconnect();
    }
    super.onPause();
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    switch (requestCode) {
        case REQUEST_CODE_CAPTURE_IMAGE:
            // Called after a photo has been taken.
            if (resultCode == Activity.RESULT_OK) {
                // Store the image data as a bitmap for writing later.
                mBitmapToSave = (Bitmap) data.getExtras().get("data");
            }
            break;
        case REQUEST_CODE_CREATOR:
            // Called after a file is saved to Drive.
            if (resultCode == RESULT_OK) {
                Log.i(TAG, "Image successfully saved.");
                mBitmapToSave = null;
                // Just start the camera again for another photo.
                startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),REQUEST_CODE_CAPTURE_IMAGE);
            }
            break;
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // Called whenever the API client fails to connect.
    Log.i(TAG, "GoogleApiClient connection failed: " + result.toString());
    if (!result.hasResolution()) {
        // show the localized error dialog.
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
        return;
    }
    // The failure has a resolution. Resolve it.
    // Called typically when the app is not yet authorized, and an
    // authorization
    // dialog is displayed to the user.
    try {
        result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
    } catch (SendIntentException e) {
        Log.e(TAG, "Exception while starting resolution activity", e);
    }
}

@Override
public void onConnected(Bundle connectionHint) {
    Log.i(TAG, "API client connected.");
    if (mBitmapToSave == null) {
        // This activity has no UI of its own. Just start the camera.
        startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
                REQUEST_CODE_CAPTURE_IMAGE);
        return;
    }
    saveFileToDrive();
}

@Override
public void onConnectionSuspended(int cause) {
    Log.i(TAG, "GoogleApiClient connection suspended");
}
 }

如何调用位于另一个名为 MainActivity 的类中的 FinalResultText,以便我可以将其制作为纯文本文件以上传到 Google Drive 文件夹?


假设您的问题是:“如何将文本文件上传到 Google 云端硬盘?”,以下是快速概述:

1/ 让您的应用程序获得授权开发者控制台 https://console.developers.google.com, see this https://developers.google.com/drive/android/auth。基本上,告诉 Google 您的 SHA1/“包名称”代表的应用程序需要访问 Drive API(不要忘记同意屏幕上的电子邮件地址)。此授权对于 REST 和 GDAA api 都有好处。

2/ 决定是否要使用REST https://developers.google.com/drive/web/about-sdk or GDAA https://developers.google.com/drive/android/intro用于访问驱动器的 API。每个都有优点缺点 https://stackoverflow.com/questions/29853316/using-google-drive-to-backup-and-restore-sqlite-database/29858197#29858197(但这是一个很长的故事)。

3/ 看看REST/GDAA 包装演示在这里 https://github.com/seanpjanson/GDAADemo,它在 MainActivity 类中具有应用程序授权过程(请参阅 onConnFail() 方法),以及两者的基本 CRUD 方法REST https://github.com/seanpjanson/RESTDemo and GDAA https://github.com/seanpjanson/GDAADemo在各自的班级里。

祝你好运

UPDATE
根据您下面的评论,我假设您希望强制快速入门演示为您工作。请记住,GDAA(或 REST)并不关心内容是什么,它只是一堆字节。因此,当 QuickStart 将位图转换为 PNG 并将其字节提供给输出流时,您必须使用字节串来完成此操作。我快速地将下面的 2 个原语组合在一起,这将用文件或字节数组为 DriveContents 的输出流提供数据(并且您可以将获得的任何内容转换为文件或字节 [])。

 DriveContents file2Cont(DriveContents driveContents, java.io.File file) {
    OutputStream oos = driveContents.getOutputStream();
    if (oos != null) try {
      InputStream is = new FileInputStream(file);
      byte[] buf = new byte[8192];
      int c = 0;
      while ((c = is.read(buf, 0, buf.length)) > 0) {
        oos.write(buf, 0, c);
        oos.flush();
      }
    } catch (Exception e)  {/*handle errors*/}
    finally {
      try {
        oos.close();
      } catch (Exception ignore) { }
    }
    return driveContents;
  }

  DriveContents bytes2Cont(DriveContents driveContents, byte[] buf) {
    OutputStream os = driveContents.getOutputStream();
    try { os.write(buf);
    } catch (IOException e)  {/*handle errors*/}
     finally {
      try { os.close();
      } catch (Exception e) {/*handle errors*/}
    }
    return driveContents;
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Android 将文本文件上传到 Google Drive 的相关文章

  • Java Sound可以用来控制系统音量吗?

    Java 声音优惠FloatControl各种声音线路功能的实例 以及MASTER GAIN http docs oracle com javase 7 docs api javax sound sampled FloatControl T
  • 使android listview布局可滚动

    我有一个 xml 文件 其布局为 ASCII 形式 ImageView TextView List
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • android-security :Google Play 警告:您的应用程序包含 SQL 注入问题

    作为我们应用程序的一部分 我们使用两个 contentProvider 但两者都受到 android exported false 的保护 但我们仍然收到一封 Google Play 警告邮件 您的应用程序包含 SQL 注入问题 他们提到的
  • Spring Security登录返回404

    我目前正在使用 Spring 框架开发我的博客 我正在实现 Spring Security 用于登录目的 一切都按预期进行 直到我提交始终返回 404 代码的登录凭据 这是我的 web xml 代码e
  • 如何使用 Tomcat 启用浏览器缓存静态内容(图像、css、js)?

    如何使用 Tomcat 启用浏览器缓存静态内容 图像 css js 首选的解决方案是编辑 spring MVC 配置文件或 web xml 尝试 改变值
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • Hibernate SET 元素 order-by 子句

    我想知道 我可以平静地接受以下事实 当 fetch select 时 您可以在映射文件中的 SET 元素上设置 order by 属性 但如果您在创建查询时获取所有内容 这样安全吗 我的意思是 他们将结果放入 HashSet 中 我不认为这
  • 如何告诉 Eclipse 忽略 Ant build.xml 中的错误?

    我有一个使用 Maven 构建的 Eclipse 项目 并且我在 Eclipse 中使用 m2eclipse 插件来获得 Maven 支持 然而这个项目还包含一个build xml它并不用于实际构建项目 而只是用于编写脚本功能 作为项目开发
  • 如何在 Struts 2 中访问 OGNL 跟踪评估?

    有人告诉我要优化网络应用程序 为此 我使用JProfiler https www ej technologies com products jprofiler overview html 我注意到很大一部分响应时间都花在了表示层上 特别是当
  • JList 类型不采用参数类型

    当我尝试编译一些代码时 我不断收到这些错误 CCC java 21 type javax swing JList does not take parameters JList
  • 在 Struts 2 中使用单个文件标签上传多个文件

    我想使用单个 Struts 2 文件标签上传多个文件 就像在 Gmail 中一样 我们使用 CTRL 键来选择多个文件来附加多个文件 我知道如何上传多个文件 但我想使用单个文件标签 我在一个小画廊应用程序中上传多个文件 如果您的操作已设置为
  • 如何组织课程、课程包[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您如何决定包名称应该是什么以及什么类应该放入哪个包中 我正在开发一个项目 在该项目中 我不断添加 删除类 并且不确定我是否需要一个新包 或者应该将其添
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 如何获取特定 GLSurfaceView 的 EGL 显示/上下文

    这是后续我原来的问题 https stackoverflow com questions 6509588 egl vs gles 2 0 on android e g java 这可能太宽泛 而这个可能太具体 但也许我可以应用牛顿法 我的具
  • 当键位于父类中时,如何将一对多集合映射到连接的子类

    我想将一对多集合映射到子类 但集合的键是父类的属性 目前我正在映射 AbstractFoo Foo 和 Bar 类 如下所示
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr
  • 尝试接收 UDP 多播时出现空指针异常

    在尝试了几次让简单的 UDP 多播接收器工作后 我感到很困惑 在我自己的代码无法按预期工作后 我尝试了 vertx 文档中发布的确切示例 DatagramSocket socket vertx createDatagramSocket ne
  • 按钮的大小取决于屏幕分辨率

    I have LinearLayout有 6 个按钮 在 4 7 英寸大小的分辨率下 按钮几乎是完美的 但在分辨率较高的设备上 它们不会占据整个屏幕 而在分辨率较低的设备上 并非所有按钮都可见 您能否解释一下如何使按钮在不同屏幕分辨率的设备
  • 与桌面浏览器相比,移动浏览器有多强大? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • R中几个big.matrix对象的逐元素平均值

    我有 17 个文件支持的 big matrix 对象 暗淡 10985 x 52598 每个 4 3GB 我想计算其中的元素平均值 结果可以存储在另一个big matrix gcm res outputM 中 biganalytics ap
  • 如何使用可变参数模板声明 std::tuple?

    也许我在这里很天真 但我相信以下代码应该编译 template
  • Control.Invoke 在隐藏的 ShowDialog 中“卡住”

    我有解决这个问题的方法 但这不是我第一次被咬 所以我试图确切地了解发生了什么 从我的申请中 我ShowDialog表单 表单上有一个按钮 单击该按钮时会调用另一个 非 GUI 线程上的代码 非 GUI 线程发回状态 Pushed then
  • 用于将类文件转换为 Java 源代码的 Eclipse 插件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当源不可用时 是否有可用的 Eclipse 插件来反编译类文件 从 class 文件生成 java 源代码 类似于 Resharper 在
  • 为什么 Python 的 argparse 对 SystemExit 使用错误代码 2?

    当我给 Python 的 argparse 输入它不喜欢的输入时 它会引发一个代码为 2 的 SystemExit 其中似乎意味着 没有这样的文件或目录 https docs python org 2 library errno html
  • 在 Django 中创建用户个人资料页面

    我是 Django 的初学者 我需要设置一个网站 其中每个用户都有一个个人资料页面 我见过 django 管理 用户的个人资料页面 应该存储一些只能由用户编辑的信息 谁能指出我这怎么可能 任何教程链接都会非常有帮助 另外 django 是否
  • 在包内的所有程序中搜索 MODIFY 语句

    我想搜索包内所有使用以下语句的程序 从 wa itab xyz 修改 itab xyz 最好使用通配符 如 itab 搜索字符串 对于一系列 itab values 如 itab abc itab def itab ghi ETC 我如何在
  • 是否可以使用seaborn 进行“缩放插图”?

    这个例子 https matplotlib org examples pylab examples axes demo html来自 matplotlib 的展示了如何进行插图 不过我正在使用seaborn 特别是kdeplot sns k
  • 如何将参数传递给backbone.js 中事件对象中绑定的函数

    我需要为 Backbone 中的事件对象中使用的函数提供参数 var DocumentRow Backbone View extend tagName li className document row events click icon
  • 无法加载 DLL“VSPerf110.dll”

    当我发布我的网络应用程序并拥有Precompile during publishing检查我在我的网络服务器上收到此错误 无法加载 DLL VSPerf110 dll 无法加载指定的模块 成立 HRESULT 异常 0x8007007E 如
  • CSS:它渲染“ul > li”比“ul li”更快吗?

    正如我从少数人那里听说的那样 使用 gt 而不是 使渲染速度更快 slide hover gt div gt span border color c8c8c8 OR slide hover div span border color c8c
  • 在 GitHub 上更新拉取请求后如何恢复审核流程?

    我分叉了 GitHub 存储库并创建了拉取请求 审稿人要求我修改 要求更改1 条评论请求由具有写入权限的审阅者进行更改 了解更多 https docs github com en github collaborating with issu
  • 如何在数据加载期间 IsBusy 为 true 时至少显示一次 Lottie 动画?

    On my Xamarin Forms 项目 我想显示一个洛蒂动画 during API调用或期间加载网站 in a WebView 为此 我限制了IsVisible的财产洛蒂动画 to the IsBusy我的财产视图模型 这个效果很好
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 如何在另一个 Gui 中启动 JADE Gui?

    如何在另一个 Gui 中启动 JADE Gui 假设我的 Gui 上有一个按钮 点击该按钮后 JADE Gui 将启动 这可能吗 如果是 怎么办 提前致谢 Regards 我假设 JADE Gui 你指的是 JADERMA http jad
  • 窗口位置替换 - 超时帮助? JavaScript问题

    我曾尝试找到一种方法 在我的代码中添加超时 然后再重定向您 我用谷歌搜索并找到了一些帮助 但他们都没有达到我的预期 这会提示用户出生年份并计算年龄 大致 如果用户未满18岁 则带他们去迪士尼乐园 否则允许进入 函数年龄按钮 var AskD
  • 使用 javascript 检测 CSP 违规

    是否可以使用 JavaScript 检测内容安全策略违规 我的 CSP 工作并发送其报告 我看到一些 url 被注入 可能是通过浏览器插件注入的 我想向用户显示一个提示 即某些插件尝试修改页面 我能否以某种方式检测与 javascript
  • 在 swiftUI 中捕获 onLongPressGesture 的 touchDown 位置?

    我正在尝试实现一个自定义上下文菜单 该菜单将在用户触摸的位置长按后出现 我一直无法找到一种方法来捕获 onLongPressGesture 的触地事件的 XY 位置 这就是我开始的地方 struct ExampleView View Sta
  • 从字符串中提取所有链接

    我有一个 javascript 变量 其中包含页面的 HTML 源代码 不是当前页面的源代码 我需要从该变量中提取所有链接 关于什么是最好的方法的任何线索 是否可以为变量中的 HTML 创建一个 DOM 然后遍历它 我不知道这是否是推荐的方
  • 使用 Android 将文本文件上传到 Google Drive

    编辑 我已将文本设置为字符串 如下所示 字符串文本 你好 我想将其转换为纯文本文件 然后上传到 Google 云端硬盘文件夹 我已经尝试过下面的代码 但它不完整 所以我无法说出出现了什么错误 我正在使用 Google Drive 快速启动