微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从Android应用程序上传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,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文件我应该怎么做?

解决方法

首先,我看到这些进口的事实:

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’)转换为内容.而且你必须提供元数据(如文件标题,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,buf.length)) > 0) {
                oos.write(buf,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,它采用不同的方法解决同样的问题.

祝好运

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐