如何从 Android 应用程序将 db 文件上传到 google 驱动器?

2023-12-03

我想将数据库文件从我的应用程序上传到谷歌驱动器。我可以在谷歌驱动器中创建一个文件夹,但我不知道如何上传数据库文件。

这是我的代码。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.Toast;


import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.drive.Drive;
import com.google.android.gms.drive.DriveApi;
import com.google.android.gms.drive.DriveContents;
import com.google.android.gms.drive.DriveFile;
import com.google.android.gms.drive.DriveFolder;
import com.google.android.gms.drive.DriveFolder.DriveFolderResult;
import com.google.android.gms.drive.DriveId;
import com.google.android.gms.drive.Metadata;
import com.google.android.gms.drive.MetadataChangeSet;
import com.google.android.gms.drive.DriveApi.DriveContentsResult;

import com.google.api.client.http.FileContent;
//import com.google.api.services.drive.Drive;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;

//import com.google.api.services.drive.Drive;


public class MainActivity extends BaseDemoActivity {

    private final static String TAG = "MainActivity";
    DriveId folderId;
    private static Uri  fileUri;


    @Override
    public void onConnected(Bundle connectionHint) {
        super.onConnected(connectionHint);


        MetadataChangeSet changeSet = new MetadataChangeSet.Builder().setTitle("New folder").build();
        Drive.DriveApi.getRootFolder(getGoogleApiClient())
        .createFolder(getGoogleApiClient(), changeSet)
        .setResultCallback(folderCreatedCallback);
        saveToDrive();
    }

    ResultCallback<DriveFolderResult> folderCreatedCallback = new ResultCallback<DriveFolderResult>() {
        @Override
        public void onResult(DriveFolderResult result) {
            if (!result.getStatus().isSuccess()) {
                showMessage("Error while trying to create the folder");
                return;
            }


            folderId = result.getDriveFolder().getDriveId();
            showMessage("Created a folder: " + result.getDriveFolder().getDriveId());
        }
    };


    final ResultCallback<DriveFolder.DriveFileResult> fileCallBack = new ResultCallback<DriveFolder.DriveFileResult>() {
        @Override
        public void onResult(DriveFolder.DriveFileResult driveFileResult) {

            if (!driveFileResult.getStatus().isSuccess()) {
                Log.v(TAG, "Error while trying to create the file");
                return;
            }
            //Initialize mFile to be processed in AsyncTask
            DriveFile mfile = driveFileResult.getDriveFile();
            new EditContentsAsyncTask(MainActivity.this).execute(mfile);

        }
    };

         public void saveToDrive()
         {
               fileUri = Uri.fromFile(new java.io.File(Environment.getDataDirectory().getPath()
                        + "/data/com.example.dbupload/databases/Student"));

                java.io.File fileContent = new java.io.File(fileUri.getPath());

                FileContent mediaContent = new FileContent(getMimeType("db"), fileContent);
                File body = new com.google.api.services.drive.model.File();

                        body.setTitle(fileContent.getName());
                        body.setMimeType(getMimeType("db"));

             //   File file = service.files().insert(body, mediaContent).execute();


         }


    public class EditContentsAsyncTask extends ApiClientAsyncTask<DriveFile, Void, Boolean> {

        public EditContentsAsyncTask(Context context) {
            super(context);
        }

        @Override
        protected Boolean doInBackgroundConnected(DriveFile... args) {
            DriveFile file = args[0];
            try {

                DriveContentsResult driveContentsResult = file.open(
                        getGoogleApiClient(), DriveFile.MODE_WRITE_ONLY, null).await();


                if (!driveContentsResult.getStatus().isSuccess()) {
                    return false;
                }

                DriveContents driveContents = driveContentsResult.getDriveContents();



                //edit the outputStream
                DatabaseHandler db = new DatabaseHandler(MainActivity.this);
                String inFileName = getApplicationContext().getDatabasePath(db.getDatabaseName()).getPath();
                //DATABASE PATH

                FileInputStream is = new FileInputStream(inFileName);
                BufferedInputStream in = new BufferedInputStream(is);
                byte[] buffer = new byte[8 * 1024];

                BufferedOutputStream out = new BufferedOutputStream(driveContents.getOutputStream());
                int n = 0;
                while ((n = in.read(buffer)) > 0) {
                    out.write(buffer, 0, n);
                }
                in.close();


                com.google.android.gms.common.api.Status status =
                        driveContents.commit(getGoogleApiClient(), null).await();
                return status.getStatus().isSuccess();
            } catch (IOException e) {
                Log.e(TAG, "IOException while appending to the output stream", e);
            }
            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (!result) {
                showMessage("Error while editing contents");
                return;
            }
            showMessage("Successfully edited contents");
        }
    }

    private String getMimeType(String string) {
        // TODO Auto-generated method stub
        return null;
    }
}

我可以在驱动器中创建一个文件夹。谁能帮我上传一个数据库文件应该做什么?


首先,我看到这些导入的事实:

import com.google.api.client.http.FileContent;
...
import com.google.api.services.drive.Drive;

表明您正在混合GDAARESTAPI。除非您想进入,否则不要这样做trouble.

因此,当您获得FolderId时,我认为它是“DB”文件的父级(如果DB文件是SQLite类型,则您的MIME类型应该是“application/x-sqlite3”)。

无论如何,在 GDAA 中,您首先必须将 java.io.File (代表“DB”)转换为content。并且你必须提供metadata(如文件标题、mime 类型、标志...)。您的元数据是正确的,这就是您绊倒的内容。以下代码片段应该可以满足您的需要(不要让我负责,我在 5 分钟内将其拼凑在一起 - 没有测试)

/******************************************************************
   * create file in GOODrive
   * @param pFldr parent's ID
   * @param titl  file name
   * @param mime  file mime type  (application/x-sqlite3)
   * @param file  file (with content) to create
   */
  static void saveToDrive(final DriveFolder pFldr, final String titl, 
                                      final String mime, final java.io.File file) {
    if (getGoogleApiClient() != null && pFldr != null && titl != null && mime != null && file != null) try {
      // create content from file
      Drive.DriveApi.newDriveContents(getGoogleApiClient()).setResultCallback(new ResultCallback<DriveContentsResult>() {
        @Override
        public void onResult(DriveContentsResult driveContentsResult) {
          DriveContents cont = driveContentsResult != null && driveContentsResult.getStatus().isSuccess() ?
            driveContentsResult.getDriveContents() : null;

          // write file to content, chunk by chunk   
          if (cont != null) try {
            OutputStream oos = cont.getOutputStream();
            if (oos != null) try {
              InputStream is = new FileInputStream(file);
              byte[] buf = new byte[4096];
              int c;
              while ((c = is.read(buf, 0, buf.length)) > 0) {
                oos.write(buf, 0, c);
                oos.flush();
              }
            }
            finally { oos.close();}

            // content's COOL, create metadata
            MetadataChangeSet meta = new Builder().setTitle(titl).setMimeType(mime).build();

            // now create file on GooDrive
            pFldr.createFile(getGoogleApiClient(), meta, cont).setResultCallback(new ResultCallback<DriveFileResult>() {
              @Override
              public void onResult(DriveFileResult driveFileResult) {
                if (driveFileResult != null && driveFileResult.getStatus().isSuccess()) {
                  // BINGO
                } else {
                  // report error
                }
              }
            });
          } catch (Exception e) { e.printStackTrace(); }
        }
      });
    } catch (Exception e) { e.printStackTrace(); }
  }

我注意到,你正在改编“官方”GDAA 演示为您的项目。如果还不够或者压倒性的,你也可以看看这个demo,对同一问题采取不同的方法。

祝你好运

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Android 应用程序将 db 文件上传到 google 驱动器? 的相关文章

  • 保存用户可以访问的 Flutter Android 应用程序中的文本文件

    我在 Flutter 中开发的 Android 应用程序的用户应该能够将一些数据保存 导出 到文本文件中 用户应该能够使用其他应用程序 包括文件管理器 在其 Android 设备上找到并访问此文件 我想 final directory aw
  • Android 12:如何防止更改手机壁纸时重新启动活动?

    在 Android 12 上 如果我们开启一个活动 进入手机主屏幕更换壁纸 切换回我们的 Activity 该 Activity 重新启动 看起来它与 Material You 主题有关 我想在我的应用程序进入前台时禁用活动的重新启动 有办
  • ACTION_VIEW 的 Intent.createChooser 仅显示默认浏览器

    我正在尝试使用 Intent createChooser 显示应用程序选择器对话框 该对话框将列出用户手机中所有可用的网络浏览器 我正在使用下面的代码 Intent browserIntent new Intent Intent ACTIO
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • 为什么 Kotlin 数据类可以在 Gson 的不可空字段中包含空值?

    在 Kotlin 中你可以创建一个data class data class CountriesResponse val count Int val countries List
  • Android studio 在日志猫中“清除全部”,更改日志级别过滤器时日志仍然会回来

    在 LogCat 中 当我单击 全部清除 按钮时 它似乎清除了所有日志 但是 如果我更改日志级别并返回到之前的日志级别 则所有日志都会返回 例如 我正在查看 Verbose 我选择 全部清除 日志清除 我切换到 调试 我切换回 详细 现在所
  • 在 Android 中的活动、服务和应用程序之间传递变量

    有人可以给我提供以下活动 服务 应用程序组合的示例吗 我拥有这三个 但我已经把我的应用程序弄得一团糟 试图在这个地方传递一堆变量 现在我不知道发生了什么 请注意 我是 Android 新手 最近我一直在努力解决这个问题 因为有很多方法可以实
  • 更改 AChartEngine 中的图例大小

    我想专门更改饼图的图例大小输出 我已经尝试了所有可以找到的 AChartEngine 方法 但没有一个只能更改图例文本大小 我必须重写 onDraw 函数吗 如果是这样 怎么办 要设置图例高度 请使用 renderer setLegendH
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 如何在照片删除后刷新 Android 的 MediaStore

    问题 如何使媒体存储刷新其已删除文件的条目 从外部存储中删除代码中的照片后 我仍然在图库中看到已删除照片的插槽 空白照片 画廊似乎反映了媒体存储 并且在媒体存储中找到了已删除的照片 直到手机重新启动或通常 直到重新扫描媒体为止 尝试扫描已删
  • 如何从SurfaceView绘制到Canvas?

    我正在尝试做简单的画家 问题是Android看起来有三个独立的Canvas并给我它来顺序绘制 我用以下方式制作了用户界面SurfaceView 把霍尔德从中拿走 Override protected void onCreate Bundle
  • 有没有办法在Android上创建一个三角形按钮?

    有没有办法创建一个三角形的按钮 我知道我可以将三角形图像作为背景 但这将使三角形之外的区域可单击 有没有办法固定按钮角 X 和 Y 以便我可以将其变成三角形 您可以覆盖OnTouch http developer android com r
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • 如何在新标签 android webview 中打开链接? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经使用 webview 创建了一个 android 应用程序来显示我的网站 我什至想添加在新选项卡中打开链接的功能 但我找不到任何
  • 如何更改锁屏自定义文本(所有者信息)?

    我写了程序代码 String message This is test Settings System putString context getContentResolver Settings Secure LOCK PATTERN EN
  • Amazon IAP 不会调用 onPurchaseResponse

    我有一个 Android 应用程序 它使用 IAP 我正在发送PurchasingManager initiateGetUserIdRequest 并得到用户识别成功 in onGetUserIdResponse 得到回复后Purchasi
  • 修改 ADW Android 启动器?

    我想更改和修改开源 ADW 启动器 启动器可在此处获取 https github com AnderWeb android packages apps Launcher https github com AnderWeb android p
  • 绘制大位图时 nSyncAndDrawFrame 速度极慢

    我想用多个大位图优化视差滚动视图 在我的 Nexus 5 上 一切都很顺利 Traceview 转储如下所示 doFrame 方法大约需要 18 毫秒才能完成 但是 当使用我的 Nexus 7 或 Android 6 模拟器 Genymot

随机推荐

  • R:如何从管道中的 Spark 连接(sparklyr)中的数据列中提取元素

    我有一个数据集如下 由于数据量较大 我通过sparklyr包 所以我只能使用管道语句 pos lt str sub csj helpful 2 neg1 lt str sub csj helpful 4 csj lt csj gt muta
  • 如何在 JSESSIONID Cookie 中设置 SameSite=None

    我有一个托管在 Heroku 上的 Spring Boot API 当我尝试通过 Google Chrome 中的 Angular 应用程序访问它时 在 Firefox 中工作正常 我面临以下问题 JSESSIONID cookie 似乎被
  • ORA-01489: 字符串连接结果太长

    ORA 01489 字符串连接结果太长 下面的 sql 查询旨在从数据库中提取以管道分隔的数据 并将其假脱机到 unix 上的文本文件中 select a b c d from table union select a b c d from
  • 样式表不适用于 Jekyll 主题 Freelancer bootstrap

    我已经有一个用户名 github io我的个人博客的存储库 现在我的目标是使用我发现的完全不同的主题创建另一个 github 托管的 jekyll 页面 这是我正在使用的主题的链接 https github com jeromelacaud
  • 使用 ReflectiveInjector 注入服务,无需指定依赖树中的所有类

    我目前有一个服务为我生成一个对象 该对象应该表现为一种活动记录 因为它可以在访问它的属性时延迟填充自身 我的第一种方法是将生成的对象使用的服务注入到创建服务中 然后将它们传递给创建的对象的构造函数 但由于创建服务从不使用这些服务 所以看起来
  • 如何将 CloudWatch 自定义日志组与 Python Shell Glue 作业结合使用?

    我有一些 Python Shell 类型的 Glue 作业 我想将作业日志发送到自定义 CloudWatch 日志组而不是默认日志组 我可以通过提供如下作业参数来实现 Spark 类型胶水作业 enable continuous cloud
  • 如何在 WinForms 应用程序中使用 Salesforce OAuth 2.0 隐式流身份验证?

    我编写了一个 Web 应用程序 它使用 OAuth 2 0 Web 服务器流连接到 Salesforce API 一切正常 但现在需要从 WinForms 桌面应用程序访问 Salesforce API 我陷入了困境 Salesforce
  • 在Scheme中添加一个元素到列表的末尾

    负责添加a到结束 b c 使 b c a 到目前为止 当我尝试时 print cons a b c I get a b c 但当我这样做时 print cons b c a I get b c a Stack 上的所有其他类似问题似乎都比这
  • Flutter:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我已经使用 python Flask 创建了 REST GET API 它的代码如下 app Flask name app route youtube def firstGetAPI try url request args get url
  • 我们可以使用 Meteor 框架和 mysql 数据库吗

    我发现很多 Meteor 框架的参考网址 其中我发现 mongodb 作为数据库 因为我对 mongodb 没有太多了解 那么有没有办法实现mysql而不是mongodb There is一种方式 但就目前的框架而言 它是一条未铺砌的道路
  • 多线程聊天服务器

    我是线程新手 我正在尝试从服务器向客户端广播消息 但我不能 看起来服务器总是在侦听新连接 但我可以使用客户端终端向其他客户端发送消息 我的问题是如何在聆听的同时允许输入 这是代码 多线程聊天服务器同步 java import java io
  • 为什么我收到错误无法解析模块路径? Eslint 与 Typescript

    我阅读了很多资源 包括将 eslint 与 Typescript 结合使用 无法解析模块的路径 我一次又一次地遇到同样的错误 yarn lint 2 24 error Unable to resolve path to module com
  • 查找非 Visual C# 组件

    我尝试了多种方法来列出表单的所有非可视组件 例如 OpenDialog ImageList TableAdapters 等 但找不到任何内容 为了找到屏幕上的控件 我在 控件 屏幕中使用了 Foreach 但对于那些非可视组件我什么也没找到
  • 使用 JNI 时 Eclipse 对 C 文件的行为令人惊讶,为什么会这样?

    我正在开发一个 Android 应用程序 其中使用了大量 JNI 代码 最近 从过去 2 3 天开始 我真的对 Eclipse 的意外行为感到恼火 一旦我打开 c 文件 它就会显示模糊的错误 但是 如果我关闭并重新打开项目 错误就会消失 请
  • 获取一个月内的工作日

    我正在尝试获取给定月份内的日期 我的计划是 获取给定月份的开始日期和结束日期 获取该范围内的所有日期 迭代它们并使用以下方法消除周末内的日期isDateInWeekend method 其余日期为工作日 所以我创建了两个NSDate扩展方法
  • groovy++ 发生了什么? [关闭]

    Closed 这个问题是无关 目前不接受答案 我刚刚偶然发现了 groovy 发现它非常有趣 不幸的是 它似乎没有进一步发展 根据 github 的说法 最后一次提交是一年多前 邮件列表完全不活跃 最后一条消息是在四月份返回的 最近没有这方
  • 如何从 XML 文档中删除所有文本

    如何删除所有文本 但保持结构完整 例如
  • 清除MySQL查询缓存而不重新启动服务器

    有什么办法可以clear mysql 查询缓存无需重新启动 mySQL 服务器 我相信你可以用 RESET QUERY CACHE 如果您运行的用户具有重新加载权限 或者 您可以通过以下方式对查询缓存进行碎片整理 FLUSH QUERY C
  • MySQL - 来自另一个表的总和

    我想运行一个包含另一个表中的总和的 select 语句 我知道我可能需要设置一个连接 但我不知道如何处理它 我想选择一个帐户列表 然后获取它们的余额 来自另一个表的总和 这是我一直以来的想法 但显然它是不正确的 SELECT account
  • 如何从 Android 应用程序将 db 文件上传到 google 驱动器?

    我想将数据库文件从我的应用程序上传到谷歌驱动器 我可以在谷歌驱动器中创建一个文件夹 但我不知道如何上传数据库文件 这是我的代码 import java io BufferedInputStream import java io Buffer