【问题标题】:How to upload a db file to google drive from android application?如何从 android 应用程序将 db 文件上传到谷歌驱动器?
【发布时间】:2015-11-03 05:29:39
【问题描述】:

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

这是我的代码。

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 文件应该怎么做?

【问题讨论】:

  • 谢谢阿琼。你能帮我解决上述问题吗?

标签: android google-drive-api google-drive-android-api


【解决方案1】:

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

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

表示您正在混合使用 GDAAREST Api。除非你想进入trouble,否则不要这样做。

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

无论如何,在 GDAA 中,您首先必须将您的 java.io.File(代表“DB”)转换为 content。您必须提供 元数据(如文件标题、mime 类型、标志 ...)。你得到了正确的元数据,它是你绊倒的内容。下面的sn-p应该做你需要的(不要追究我的责任,我在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。如果它还不够充分或压倒性的,你也可以看看这个demo,它对同一个问题采取了不同的方法。

祝你好运

【讨论】:

    【解决方案2】:

    检查您的数据库文件的 MIME 类型。

    private String getMimeType(String string) {
        //set return "application/x-sqlite3";
        return "application/x-sqlite3";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多