Пустой 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 ядра.