2013-10-02 4 views
1

Я никогда не работал с API Dropbox раньше, и я заметил, что есть два API, доступных Core и Sync, и я не знаю, какой из них я должен использовать. Вот немного о том, что я пытаюсь сделать:Двухстороннее приложение синхронизации, Core API или Sync API?

Простая двусторонняя синхронизация, которая отражает папку на пользователях Dropbox на устройство и наоборот. Папка может содержать любые файлы любого типа. При создании приложения в Консоли приложений он запрашивал разрешения, и, похоже, полное разрешение Dropbox совместимо с Core API.

Может ли кто-нибудь выяснить, какой API мне нужно будет использовать? Спасибо!

EDIT: я создал приложение с полными разрешениями на удаление, это не сработало с 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) { 

    } 
} 

App тип разрешения является "текстовые файлы". При использовании приложения с «Full раздаточной» Я получаю другую ошибку:

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

ответ

1

Я никогда не работал с Core API, но я могу одновременно загружать и получать файлы.

Возможно, стоит упомянуть, что намерение API Sync (вероятно, также ядро) не должно поддерживать локальные файлы в актуальном состоянии. Скорее он предназначен, чтобы вы могли получать файлы, доступные в Dropbox, и загружать их на лету.

В моем случае необходимо, чтобы файлы Dropbox извлекались локально, поэтому я запускаю алгоритм синхронизации, который проходит через все файлы Dropbox, проверяет измененные и размерные файлы и загружает все, либо новые, либо измененные файлы в SD. Загрузка выполняется с использованием IntentServices. Выдача IntentService для каждого файла, который необходимо загрузить.

Итак, для синхронизации с синхронизацией Sync API работает нормально. Другой путь должен быть возможен, хотя я считаю, что с этим все труднее справиться.

Подводя итог тому, что вы должны это сделать, но вам нужно много сделать, чтобы подняться.

Несколько вопросов, которые я видел в Core API, я не заметил каких-либо существенных различий, кроме Sync API, живет в конкретной папке Dropbox «Dropbox/apps/yourapp», Core API этого не делает.

Если это так, я бы порекомендовал Sync API, поскольку с ним проще работать.

Я готов опубликовать свой код один путь синхронизации, если вы решите пойти на это :)

Edit: Добавлен мой код для письменной форме в 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; 
} 
} 

До этого point Мне нужно было только писать файлы из активов, но их можно было легко переписать для записи из любого другого файла.

+0

Я вижу, проблема, с которой я сейчас сталкиваюсь, - это Dropbox App Console, которая позволяет мне получить доступ к определенному типу файла в Dropbox, например, только текстовые файлы или только изображения, но мне нужен доступ ко всем видам, даже не перечисленным в при создании приложения выбираются «конкретные типы файлов». Как вы обошли это? – Linkandzelda

+0

Я настраивал приложение для работы с текстовыми файлами и пытался создать файл .dat, он дал следующее: DROPBOX_DISALLOWED: sync.hpp: 300: приложению не разрешено создавать файл p (/c7/r6/t4.dat). – Linkandzelda

+0

Можете ли вы опубликовать код, в котором вы столкнулись с этой ошибкой? до сих пор я загружал/загружал .txt .png .class .pdf и один двоичный файл без расширений. – cYrixmorten

0

ну это зависит от типа приложения вы пытаетесь создать ..

  • , если вы хотите синхронизировать файлы и папка, а не содержимое в файлах, используйте Core API. потому что он поддерживает несколько платформ, то, что я вижу в основе Api, поддерживает только загрузку и загрузку файлов, а не изменения или изменения в файлах
  • , если вы хотите также сохранить содержимое файлов синхронизации, используйте синхронизацию Api. Поскольку Sync Api также может синхронизировать изменения в файлах.

Я думаю, что sync api должен работать хорошо для вас, если вы не хотите принимать полное разрешение Dropbox.

1

Мой общий совет - использовать Sync API на мобильных платформах. Под ним по-прежнему остается тот же Core API, но Sync API дает вам представление о Dropbox, которое выглядит как обычная файловая система. Обычно это проще для работы, чем напрямую с использованием Core API.

Что касается разрешений, то Sync API не поддерживает разрешение «Полный Dropbox», поэтому вам нужно будет использовать разрешение «Тип файла» (доступ к определенным типам файлов по расширению) или разрешение «Папка приложения» (например, доступ к файлам любого типа, но только в указанной папке для вашего приложения, например Dropbox/Apps /).

+0

Я думаю, что папка Dropbox Apps - единственный способ пойти, если я хочу получить доступ к типу файлов без Core API. Спасибо за информацию. – Linkandzelda

Смежные вопросы