Пустой PDF-файл после синхронизации с использованием API Dropbox на Android

Я написал приложение для Android, которое экспортирует PDF-файл по электронной почте и Dropbox. Когда я отправляю файл pdf с помощью электронной почты, я могу просмотреть файл на моем Mac.. Но тот же файл, загруженный в Dropbox через Android Dropbox API, PDF-файл кажется пустым, когда я открываю на моем Mac. Но размер файла как версии Dropbox, так и версии электронной почты одинаков. Это происходит только для файлов PDF, когда я отправляю текстовый файл через Dropbox Android Api, он работает нормально.

Кто-нибудь сталкивался с такой проблемой раньше? и есть ли решения? Я использую последний Dropbox Android SDK со стороны разработчиков Dropbox.

 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 ответа

Решение

Что касается того, почему ваш код не работает, я думаю, что ваш комментарий выше прав в том, что он касается попытки прочитать файл, как будто это текст. (По крайней мере, вы, вероятно, пишете пару новых строк в файл.)

Но в любом случае этот код действительно не нужен. Вместо вызова writeDropBoxFileFromFile метод, который вы написали, просто сделайте dropboxFile.writeFromExistingFile(localFile, false);

(Документы находятся здесь: https://www.dropbox.com/developers/sync/docs/android. Просто ищите "writeFromExistingFile".)

Наконец я выясняю проблему. Это было так глупо с моей стороны, чтобы перейти к программированию, прежде чем читать больше об API. Похоже, Dropbox имеет два типа API-интерфейсов. Один для обычного написания текста с использованием синхронизации pi, а другой для более сложной задачи, такой как загрузка файлов с помощью API ядра.

Базовый API

Другие вопросы по тегам