如何从 android 应用程序将 db 文件上传到谷歌驱动器? [英] How to upload a db file to google drive from android application?

查看:21
本文介绍了如何从 android 应用程序将 db 文件上传到谷歌驱动器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to upload a db file from my app to google drive. I am able to create a folder in google drive but I am not getting how to upload db file .

这是我的代码.

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;
    }
}

我可以在驱动器中创建一个文件夹.谁能帮我上传一个 db 文件应该怎么做?

I am able to create a folder in drive. can any one please help me what I should do for uploading a db file?

推荐答案

首先,我看到了这些导入:

First, the fact that I'm seeing these imports:

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

表示您正在混合 GDAAREST API.除非您想遇到麻烦,否则不要这样做.

indicates that you're mixing GDAA and the REST Api. Do not do it unless you want to get in trouble.

所以,当您获得 FolderId 时,我认为它是您的DB"文件的父级(如果 DB 文件是 SQLite 类型,您的 MIME TYPE 应该是application/x-sqlite3").

So, when you got your FolderId, it is a parent of your 'DB' file, I presume (and if the DB file is a SQLite type, your MIME TYPE should be 'application/x-sqlite3').

无论如何,在 GDAA 中,您首先必须将您的 java.io.File(代表DB")转换为 content.您必须提供 元数据(如文件标题、mime 类型、标志 ...).你得到了正确的元数据,它是你绊倒的内容.以下片段应该可以满足您的需求(不要追究我的责任,我在 5 分钟内将其拼凑在一起 - 没有测试)

Anyway, in GDAA, you first have to turn your java.io.File (that represents the 'DB') into content. And you have to supply metadata (like file title, mime type, flags ...). You got the metadata right, it is the content you tripped over. The following snippet should do what you need (don't hold me accountable, I slammed it together in 5 minutes - no testing)

/******************************************************************
   * 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.如果它还不够或压倒性的,你也可以看看这个 demo,它采用了不同的方法同样的问题.

I noticed, you're adapting the 'official' GDAA DEMO for your project. In case it is not sufficient or overwhelming, you may also look at this demo, that takes a different approach to the same problem.

祝你好运

这篇关于如何从 android 应用程序将 db 文件上传到谷歌驱动器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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