1

I've never worked with the Dropbox API before and I noticed there's 2 APIs available the Core and Sync, and I don't know which one I should be using. Here's a bit about what I'm trying to do:

A simple two-way sync that mirrors a folder on the users Dropbox to the device, and vice versa. The folder could contain any files there of any type. When making the App on the App Console it asked for permissions and it seems the full dropbox permission is only compatible with the Core API.

Is anyone able to clarify which API I would need to be using? Thanks!

EDIT: I created an app with full dropbox permissions, this failed to work with the Sync API (as stated on the creation page), so instead I made another app allowing text files, then created a .dat file, which resulted in the following error:

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

Is there any way around this particularly issue or will I have to use the Core API? Seems a bit limiting that the apps can only work with certain file types only.

EDIT2: My code using to test right now:

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) {

    }
}

App permission type is "text files". When using an app with "Full dropbox" I get a different error:

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

3 回答 3

1

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

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

于 2013-10-02T17:21:22.423 回答
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;
}
}

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

于 2013-10-02T15:05:37.527 回答
0

好吧,这取决于您尝试创建的应用程序的类型..

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

如果您不想获得完整的 Dropbox 权限,我认为同步 api 应该对您有用。

于 2013-10-02T14:37:36.090 回答