使用android上的dropbox api同步后清空pdf文件

时间:2014-02-20 12:46:29

标签: android pdf dropbox-api

我写了一个Android应用程序,通过电子邮件和Dropbox导出pdf文件。当我使用电子邮件意图发送pdf文件时,我可以在我的mac上查看文件..但是同一个文件通过android dropbox api上传到dropbox,当我在我的Mac上打开时,pdf文件似乎是空的。但是Dropbox版本和电子邮件版本的文件大小是相同的。这只发生在pdf文件中,当我通过dropbox android api发送文本文件时,它工作正常。

以前有人遇到过这样的问题吗?有什么解决方案吗?我正在使用Dropbox开发者方面最新的dropbox android sdk。

 public DropboxExportManager(Activity context) {
        this.context = context;
    }


    private void setUpAccountDetail() {
        handler = new Handler(Looper.getMainLooper());
        progressDialog = new ProgressDialog(context);
        progressDialog
                .setMessage(context.getString(R.string.uploading_message));

        dropBoxAccountManager = DbxAccountManager.getInstance(
                context.getApplicationContext(), PropertyManager.getInstance().getString(
                PropertyKeys.DROP_BOX_KEY), PropertyManager.getInstance().getString(
                PropertyKeys.DROP_BOX_SECRET));
    }

    public void connectToDropbox(String file) {
        setUpAccountDetail();

        this.dropBoxFile = file;

        if (dropBoxAccountManager.hasLinkedAccount()) {
            uploadFileToDropBox();
        } else {
            dropBoxAccountManager.startLink(context, REQUEST_LINK_TO_DROPBOX);

        }

    }

    public void uploadFileToDropBox() {

        try {

            DbxPath dropboxFilePath = new DbxPath(DbxPath.ROOT, directory + dropBoxFile);

            DbxFileSystem dropBoxFileSystem = DbxFileSystem
                    .forAccount(dropBoxAccountManager.getLinkedAccount());

            File localFile = new File(FileService.getInstance()
                    .getPathAndCreateIfNotExists(FileService.EXTERNAL,
                            AppConstants.CACHE_DIRECTORY + dropBoxFile));

            dropBoxFileSystem.addPathListener(pathListener, dropboxFilePath,
                    Mode.PATH_ONLY);

            if (localFile.exists()) {
                Logs.d("Local file exist");
                DbxFile dropboxFile;
                if (!dropBoxFileSystem.exists(dropboxFilePath)) {
                    Logs.e("Dropbox file doesnt exist");
                    dropboxFile = dropBoxFileSystem.create(dropboxFilePath);
                    writeDropBoxFileFromFile(localFile, dropboxFile);
                } else {
                    Logs.d("Dropbox file exist");
                    dropBoxFileSystem.delete(dropboxFilePath);
                    dropboxFile = dropBoxFileSystem.create(dropboxFilePath);
                    writeDropBoxFileFromFile(localFile, dropboxFile);
                }

                if (dropboxFile != null) {
                    dropboxFile.close();
                }

                if (exportManager != null) {
                    exportManager.onExportComplete();
                }

            } else {
                Logs.e("Local file doesnt exist");
            }

        } catch (IOException e) {
            statusMessage = "Dropbox test failed: " + e;
        }

        Logs.d(statusMessage);
    }

    public boolean writeDropBoxFileFromFile(File file, DbxFile dbFile) {
        try {
            FileInputStream fin = new FileInputStream(file);
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    fin));
            String line = null;
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }

            dbFile.writeString(sb.toString());

            fin.close();
        } catch (Exception e) {
            return false;
        } finally {
            dbFile.close();

        }

        return true;

    }

    private DbxFileSystem.PathListener pathListener = new DbxFileSystem.PathListener() {

        @Override
        public void onPathChange(DbxFileSystem dbFS, DbxPath dbPath, Mode arg2) {
            try {

                Logs.d("Uploading File "
                        + dbFS.getSyncStatus().upload.inProgress);

                if (dbFS.getSyncStatus().upload.inProgress) {
                    handler.post(new Runnable() {
                        public void run() {
                            progressDialog.show();
                        }
                    });

                } else {
                    handler.post(new Runnable() {
                        public void run() {
                            progressDialog.dismiss();
                        }
                    });

                    dbFS.removePathListenerForAll(pathListener);
                }

            } catch (DbxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

2 个答案:

答案 0 :(得分:1)

至于为什么你的代码不起作用,我认为你上面的评论是正确的,因为它与试图读取文件有关,就好像它是文本一样。 (至少,你可能会在文件中写几个新行。)

但无论如何都不需要那个代码。不要调用您编写的writeDropBoxFileFromFile方法,只需执行dropboxFile.writeFromExistingFile(localFile, false);

即可

(文档在这里:https://www.dropbox.com/developers/sync/docs/android#com.dropbox.sync.android.DbxFile。只需查找“writeFromExistingFile”。)

答案 1 :(得分:0)

最后我找出问题所在。在阅读有关apis的更多信息之前,我很难跳入编程。好像Dropbox有两种类型的api。一个用于使用同步pi进行普通文本写入,另一个用于使用核心API上传文件等更复杂的任务。

Core API