我之前从未使用过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.
答案 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)
这取决于您尝试创建的应用类型..
如果您不想获取完整的Dropbox权限,我认为sync ap应该对您有用。