Android から Dropbox を利用したアプリを作成してみる

以下を参考に。

https://www.dropbox.com/developers/start/setup#android

API リファレンス https://www.dropbox.com/static/developers/dropbox-android-sdk-1.3.1-docs/index.html

Dropbox アカウントの開設

まず、Dropbox アカウントが開設されていないと話になりません。

ここ  から開設できます(なおかつ、ここからアカウント登録すると、500MB の容量ボーナスがもらえます!)

Android SDK のセットアップ

My Apps ページから、新規アプリケーションを作成

アプリケーションから利用するために、アプリケーションの情報を登録する必要がある。

https://www.dropbox.com/developers/apply

以下の手順で、app キー と app シークレットキー が取得でき、API が利用可能となる。

android_dropbox01 

Create App ボタンを押下すると、アプリケーション名と、以下のタイプを選択するダイアログが表示される

選択する内容は、、、

App フォルダ

ユーザーのDropbox内の、一つのフォルダにしか、アクセスする必要が無い場合(推奨)

フル Dropbox

ユーザーのDropbox 全体にアクセスする場合

あとは、ウィザードに従い、内容を設定。

SDKのダウンロード

SDK を https://www.dropbox.com/developers/reference/sdk からダウンロード

android_dropbox02

Dropbox + アイコンを押すと、自分のDropbox フォルダに、dropbox-android-sdk-1.3.1 フォルダが作成された。

中に、サンプルも入っているので、参考になる。

ライブラリの設定

Dropbox\dropbox-android-sdk-1.3.1\lib にある、jar を、プロジェクトの直下に、libs フォルダーを作成し、そこにコピー

プロジェクトのプロパティから、ライブラリをビルドパスに追加する。

android_dropbox03

実装

app キー と app シークレットキー など、定数を切っておく。

  1. public class FlashcardRoidApplication extends Application {
  2. // app キー
  3. public static final String DROPBOX_APP_KEY = "xxxxxxxxxxxxx";
  4. // app シークレットキー
  5. public static final String DROPBOX_APP_SCECRET = "xxxxxxxxxxxxx";
  6. public static final String DROPBOX_APP_FOLDER_NAME = "FlashcardRoid";
  7. public static final AccessType DROPBOX_ACCESS_TYPE = AccessType.APP_FOLDER;
  8. }

AndroidManifest.xml に Dropbox 認証用のアクティビティを登録

  1. <activity
  2. android:name="com.dropbox.client2.android.AuthActivity"
  3. android:launchMode="singleTask"
  4. android:configChanges="orientation|keyboard">
  5. <intent-filter>
  6. <!-- 以下のxxxxxxに app キー を設定する -->
  7. <data android:scheme="db-xxxxxx" />
  8. <action android:name="android.intent.action.VIEW" />
  9. <category android:name="android.intent.category.BROWSABLE"/>
  10. <category android:name="android.intent.category.DEFAULT" />
  11. </intent-filter>
  12. </activity>

パーミッションを追加

  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>

認証するまでのコード

  1. package info.typea.flashcard;
  2.  
  3. import com.dropbox.client2.DropboxAPI;
  4. import com.dropbox.client2.android.AndroidAuthSession;
  5. import com.dropbox.client2.session.AccessTokenPair;
  6. import com.dropbox.client2.session.AppKeyPair;
  7.  
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11.  
  12. public class FlashcardRoidActivity extends Activity {
  13. private DropboxAPI mDBApi;
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. AndroidAuthSession session = buildDropboxSession();
  19. mDBApi = new DropboxAPI(session);
  20. mDBApi.getSession().startAuthentication(FlashcardRoidActivity.this);
  21. }
  22. @Override
  23. protected void onResume() {
  24. super.onResume();
  25. AndroidAuthSession session = mDBApi.getSession();
  26. if (session.authenticationSuccessful()) {
  27. try {
  28. mDBApi.getSession().finishAuthentication();
  29. AccessTokenPair tokens = mDBApi.getSession().getAccessTokenPair();
  30. storeDropboxKeys(tokens.key, tokens.secret);
  31. } catch (IllegalStateException e) {
  32. Log.i(FlashcardRoidApplication.TAG, "Error authenticating", e);
  33. }
  34. }
  35. }
  36. /**
  37. * Dropbox アクセスキーを保持しておく
  38. * @param key
  39. * @param secret
  40. */
  41. private void storeDropboxKeys(String key, String secret) {
  42. // TODO SharedPreferences に保持しておく実装
  43. }
  44. /**
  45. * Dropbox アクセスキーを取得する
  46. * @return
  47. */
  48. private String[] getStoredDropboxKeys() {
  49. // TODO SharedPreferences から アクセスキーを取得する実装
  50. return null;
  51. }
  52. /**
  53. * Dropbox セッションを作成する
  54. * @return
  55. */
  56. private AndroidAuthSession buildDropboxSession() {
  57. AppKeyPair appKeyPair
  58. = new AppKeyPair(FlashcardRoidApplication.DROPBOX_APP_KEY, FlashcardRoidApplication.DROPBOX_APP_SCECRET);
  59. AndroidAuthSession session = null;
  60. String[] keys = getStoredDropboxKeys();
  61. if (keys == null) {
  62. session = new AndroidAuthSession(appKeyPair, FlashcardRoidApplication.DROPBOX_ACCESS_TYPE);
  63. } else {
  64. AccessTokenPair accessToken = new AccessTokenPair(keys[0], keys[1]);
  65. session = new AndroidAuthSession(appKeyPair, FlashcardRoidApplication.DROPBOX_ACCESS_TYPE, accessToken);
  66. }
  67. return session;
  68. }
  69. }

この状態だと、毎回、以下の認証画面が出てくるので、SharedPreferences などに保存しておく。上記SDKに含まれるサンプルでは、そうしているので参考にするとよい。

ここまでで実行

android_dropbox04

Dropboxの認証アクティビティが表示され、許可すると処理が続行されるようになる。

ファイルをアップロードしてみる

とりあえず、ボタンを作って、ファイルをアップロードしてみる。以下を、アクティビティの onCreate に記述(レイアウトにもボタンを追加)

        Button btnUpload = (Button)findViewById(R.id.btn_upload);
        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Date now = new Date();
                    InputStream in = new ByteArrayInputStream(now.toString().getBytes());
                    
                    String filename = String.format("/%tY%tm%td%tH%tM%tS.txt", now, now, now, now, now, now);
                    Entry entry = mDBApi.putFile(filename, in, now.toString().getBytes().length, null, null);

                } catch (Exception e) {
                    Log.e(FlashcardRoidApplication.TAG,"Upload Error", e);
                }
            }
        });        

android_dropbox05

ファイルがアップロード、同期された。PCの方に通知される。

ファイルの一覧を取得し、メタデータを表示してみる

search() の query 引数には、3文字以上渡す必要があるようだ。"txt" を渡しているが、"*.*" のようなワイルドカードはどうも機能しない感じ。

  1. Button btnSearch = (Button)findViewById(R.id.btn_search);
  2. btnSearch.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. try {
  6. int filelimit = -1; // Default is 10,000 if you pass in 0 or less
  7. List entries = mDBApi.search("/", "txt", filelimit, false);
  8. for (Entry entry : entries) {
  9. // メタデータを含めて表示
  10. Log.i(FlashcardRoidApplication.TAG,
  11. String.format("path=%s,rev=%s",
  12. entry.path,
  13. entry.rev));
  14. }
  15. } catch (Exception e) {
  16. Log.e(FlashcardRoidApplication.TAG,"Upload Error", e);
  17. }
  18. }
  19. });

上記でアップロードしたファイル情報が取得できている

android_dropbox06

ファイルをダウンロードしてみる

上記で作成して、Dropbox 上に保存したファイル(最新バージョン)を、Andoroid 端末の SDカード上にダウンロードしてみる。

  1. Button btnDown = (Button)findViewById(R.id.btn_download);
  2. btnDown.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. try {
  6. String target = "20120525171459.txt"; // 対象ファイル名
  7. // 端末の SDカード上のデータ格納先
  8. File sdcarddir = Environment.getExternalStorageDirectory();
  9. String apppath = sdcarddir.getAbsolutePath()
  10. + File.separatorChar
  11. + "data"
  12. + File.separatorChar
  13. + this.getClass().getPackage().getName().replaceAll("[.]", Character.toString(File.separatorChar))
  14. + File.separatorChar
  15. ;
  16. File appDir = new File(apppath);
  17. if (!appDir.exists()) {
  18. if(!appDir.mkdirs()) {
  19. throw new IllegalStateException("おそらく、android.permission.WRITE_EXTERNAL_STORAGE が マニフェストに設定されてないのでは?");
  20. }
  21. }
  22. File file = new File(apppath + File.separatorChar + target);
  23. Log.i(FlashcardRoidApplication.TAG, "download destination : " + file.getAbsolutePath());
  24. OutputStream os = new FileOutputStream(file);
  25. DropboxFileInfo dfi = mDBApi.getFile(File.separatorChar + target, null, os, null);
  26. Log.i(FlashcardRoidApplication.TAG, "file's revision : " + dfi.getMetadata().rev);
  27. } catch(Exception e) {
  28. Log.e(FlashcardRoidApplication.TAG,"Download Error", e);
  29. }
  30. }
  31. });

Dropbox では、変更を 30日まで保持している(Pack-Rat アドオン利用時にはそれ以上)が、DropboxFileInfo は、メタデータエントリーを含んでおり、rev を比較することで、最新版かどうかを判定できる。

android_dropbox07

端末のSDカード、アプリケーションフォルダにダウンロードされた。

うーん簡単に使えて便利。アプリ開発の幅が拡がりそうな気はする。

あと、Revert とか、Conflict とか、通常のバージョン管理システムで意識するような点は

どうするのが Dropbox 的に良いのかが気になるが、単純に使う分には問題なさそうだ。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です