双向同步应用,Core API或Sync API?

时间:2013-10-02 14:25:23

标签: android dropbox dropbox-api

我之前从未使用过Dropbox API,我注意到Core和Sync有2个可用的API,我不知道应该使用哪个。这里有一些我正在尝试做的事情:

一个简单的双向同步,它将用户Dropbox上的文件夹镜像到设备,反之亦然。该文件夹可以包含任何类型的任何文件。在App Console上制作应用程序时,它要求权限,似乎完整的Dropbox权限只与Core API兼容。

是否有人能够澄清我需要使用哪种API? 谢谢!

编辑:我创建了一个具有完整保管箱权限的应用,这无法使用Sync API(如创建页面所述),因此我创建了另一个允许文本文件的应用,然后创建了一个.dat文件,结果在以下错误中:

DROPBOX_DISALLOWED: sync.hpp:300: app is not allowed to create file p(/c7/r6/t4.dat)

有没有解决这个特殊问题的方法,还是我必须使用Core API?似乎有点限制,应用程序只能使用某些文件类型。

EDIT2:我的代码现在用于测试:

public void SyncTest() {
    try {
        DbxFileSystem dbxFs = DbxFileSystem.forAccount(mDbxAcctMgr.getLinkedAccount());

        DbxFile testFile = dbxFs.create(new DbxPath(getString(R.string.remote_path) + "hello.dat"));
        try {
            testFile.writeString("Hello Dropbox!");
        } catch(IOException ioe) {

        } finally {
            testFile.close();
            dbxFs.syncNowAndWait();
        }
    } catch(com.dropbox.sync.android.DbxException.Unauthorized ue) {
        alert(getString(R.string.unauth));
    } catch (com.dropbox.sync.android.DbxException se) {

    }
}

应用权限类型是“文本文件”。使用带有“完整保管箱”的应用时,我收到了不同的错误:

DROPBOX_ERROR_USAGE: sync.cpp:244: This app is not allowed to use the Sync API for file access.

3 个答案:

答案 0 :(得分:1)

我从未使用过Core API,但我能够下载和接收文件。

值得一提的是,Sync API(可能也是核心)的目的不是让本地文件保持最新。相反,它旨在让您检索Dropbox上可用的文件并即时下载。

我的用例需要在本地检索Dropbox文件,因此我运行一个同步算法,该算法运行所有Dropbox文件,检查已修改和大小,并将所有新文件或已修改文件下载到SD。 使用IntentServices完成下载。为每个需要下载的文件发布IntentService。

因此,对于单向同步,Sync API工作正常。另一种方式也应该是可能的,尽管我认为更难以管理。

最重要的是你应该能够做到,但你必须自己做很多事情。

我在Core API上看到的几个问题,我没有发现任何巨大的差异,除了Sync API存在于特定的Dropbox文件夹“Dropbox / apps / yourapp”中,Core API没有。

如果是这种情况,我会推荐使用Sync API,因为它似乎更容易使用。

如果你愿意,我愿意发布单向同步的代码:)

修改:添加了我写入Dropbox的代码

public class DropboxWriter {

private static final String TAG = "DropboxWriter";

public static boolean writeAssetBinary(Context context, String assetFile,
        DbxFile toFile) {

    String tempsdpath = Environment.getExternalStorageDirectory()
            .toString() + "/temp";

    AssetManager assetManager = context.getAssets();

    OutputStream outputStream = null;
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open(assetFile);
        outputStream = new FileOutputStream(tempsdpath + "/" + assetFile);
        byte buf[] = new byte[1024];
        int len;
        while ((len = inputStream.read(buf)) != -1) {
            outputStream.write(buf, 0, len);
        }

    } catch (IOException e) {
        Log.e(TAG, e.getMessage(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
            }
        }
        if (outputStream != null) {

            try {
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    try {
        File file = new File(tempsdpath, assetFile);
        toFile.writeFromExistingFile(file, false);
        return true;
    } catch (IOException e) {
        Log.e(TAG, e.getMessage(), e);
    } finally {
        toFile.close();
    }
    return false;
}

public static boolean writeAssetText(Context context, String assetFile,
        DbxFile toFile) {

    AssetManager assetManager = context.getAssets();
    ByteArrayOutputStream outputStream = null;
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open(assetFile);
        outputStream = new ByteArrayOutputStream();
        byte buf[] = new byte[1024];
        int len;
        while ((len = inputStream.read(buf)) != -1) {
            outputStream.write(buf, 0, len);
        }
        outputStream.flush();
        outputStream.close();
        inputStream.close();
    } catch (IOException e) {
        Log.e(TAG, e.getMessage(), e);
    }

    try {
        toFile.writeString(outputStream.toString());
        return true;
    } catch (IOException e) {
        Log.e(TAG, e.getMessage(), e);
    } finally {
        toFile.close();
    }
    return false;
}
}

到目前为止,我只需要从资产中写入文件,但可以轻松地重写以从任何其他文件写入。

答案 1 :(得分:1)

我的一般建议是在移动平台上使用Sync API。下面仍然是相同的Core API,但Sync API为您提供了Dropbox的视图,它看起来就像一个普通的文件系统。与直接使用Core API相比,这通常更容易使用。

对于权限,Sync API不支持“Full Dropbox”权限,因此您必须使用“文件类型”权限(通过扩展程序访问某些类型的文件)或“App folder”权限(访问权限)到任何类型的文件,但只能在您的应用程序的指定文件夹中,例如Dropbox / Apps /)。

答案 2 :(得分:0)

这取决于您尝试创建的应用类型..

  • 如果您想要同步文件和文件夹而不是文件中的内容,请使用Core API。因为它支持多个平台,我看到核心Api只支持下载和上传文件,而不支持文件的编辑或更改
  • 如果您也想要同步文件内容,请使用同步Api。因为Sync Api也可以同步文件中的更改。

如果您不想获取完整的Dropbox权限,我认为sync ap应该对您有用。