Kii Cloud Android SDKを使ってファイルアップロードする


この記事ではKii Cloud の Android SDK を使ったファイルアップロードについてご紹介します。が、先に「Kii Cloud JavaScript SDKを使ってデータを保存する」を見ていただいて、Kii Cloud 上でのデータ保存について知っていただくとより分かりやすいかと思います。

Android SDKの利用準備

ファイルアップロードの話の前にAndroid SDK の利用方法について軽く触れておきます。
Javascript SDKの準備編と同様に新規アプリケーションの作成を行い、
Application ID と Application Key と KiiCloudStorageSDK-xxx.jarファイルを入手します。
SDKの初期化
KiiCloudStorageSDK-xxx.jarファイルはlibsフォルダに配置し、
アプリケーションクラスに以下のコードを実装し、起動時に初期化するようにします。


public class MobileApp extends Application {
  @Override
  protected void onCreate() {
    // APPID と APPKEY の項目は、開発者ポータルにて取得した Application ID と Application Key を設定
    Kii.initialize("___APPID___", "___APPKEY___", Site.JP);
  }
}

また、マニフェストファイルでは以下のようなパーミッション設定になります。


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

ファイルのアップロード

Kii Cloud でのファイルは、Object に紐付く ObjectBody として管理することになります。
Object については「Kii Cloud JavaScript SDKを使ってデータを保存する」をご参照ください。簡単に説明すると、Object は Key-Value により構成されるJSON オブジェクトで、その Objectの入れ物である Bucket ごとに管理されます。下記の図は Javascript SDKの準備編でBucket/Objectの概要を説明した図です。
kii003

ObjectBody はこれら Object と紐付けてファイル管理する為の機能で、ファイルアップロードの方法としては2種類用意されています。

シンプルなアップロード
この方法を利用したアップロードは、アップロード状況の取得や、アップロード完了の取得は可能ですが、途中キャンセルは実行できません。ネットワーク切断などでアップロードが中断した場合、最初からアップロードし直すことになります。よって、安定したネットワーク下での小さなサイズのファイルアップロードに向いています。
中断・再開が可能なアップロード
この方法を利用したアップロードは、任意のタイミングでアップロードの中断・再開・取り消しが可能です。ネットワーク切断などでアップロードが中断した場合、中断した箇所からのアップロードが可能になります。よって、不安定なネットワーク下での大きなサイズのファイルアップロードに向いています。

以下の図は、中断・再開可能なアップロードの仕組みを簡単な図で表したものです。

ObjectBody

  1. ファイルを紐付けるObjectを生成する
  2. KiiObject に転送ファイルを指定すると…
  3. KiiUploader を生成されるので、転送開始する
  4. 転送中の KiiUploader はバケツ内の KiiRTransferManager で管理される
  5. KiiUploader は、転送状態を持つ KiiRTransferInfo を保持している
  6. 転送中の KiiUploader に対して、中断・再開・停止のコントロールができる
  7. 転送完了・停止した KiiUploader は、KiiRTransferManager の管理から外れる
  8. 転送完了したファイルは、ObjectBody として管理される

中断・再開可能なアップロードの開始


// アプリスコープのバケツ"mydata"に属するObjectを作成
KiiObject object = Kii.bucket("mydata").object();
object.set("title", "MyImg");

// File localFile: アップロード対象ファイル
// Objectに転送ファイルを指定して、KiiUploader を生成
KiiUploader uploader = object.uploader(context, localFile);

// アップロード開始
uploader.transferAsync(new KiiRTransferCallback() {
  // 開始を検知
  public void onStart(KiiRTransfer operator) {
    // KiiRTransfer operator: KiiUploaderはKiiRTransferManagerに転送完了するまで管理される
  }

  // 転送状況の検知
  public void onProgress(KiiRTransfer operator, long completedInBytes, long totalSizeinBytes){
  }

  // アップロード完了
  public void onTransferCompleted(KiiRTransfer operator, Exception e) {
    if(e != null){
     //中断実行すると、SuspendedExceptionが発行される
    }
  }
});

アップロードの中断


// バケツ"mydata"の管理下にあるKiiRTransferManagerを取得
KiiBucket bucket = Kii.bucket("mydata");
KiiRTransferManager manager = bucket.getTransferManager();

// KiiRTransferManagerでアップロード中のKiiUploader一覧を取得
List uploaders = null;
try {
  uploaders = manager.listUploadEntries(context);
} catch (StateStoreAccessException e){
}

if(uploaders.size() > 0){
  // KiiUploader一覧から中断対象を選択
  KiiUploader uploader = uploaders.get(0);
  // 中断実行
  uploader.suspendAsync(new KiiRTransferCallback() {
    // 中断完了
    public void onSuspendCompleted(KiiRTransfer operator, Exception e) {
      // 中断完了後も、KiiUploader は KiiRTransferManager の管理下にいる
    }
  });
}

アップロードの終了

  // 中断と同じ方法で終了対象の KiiUploader を取得する
  // 終了実行
  uploader.terminateAsync(new KiiRTransferCallback() {
   // 終了完了
   public void onTerminateCompleted(KiiRTransfer operator, Exception e) {
    // 終了完了後、KiiUploader は KiiRTransferManagerの管理下から外れる
   }
  });

以上のように、Kii Cloud 上でのファイルアップロードは Object に紐付く ObjectBody として行います。また、アップロードの方法としては2種類あり、その内の中断・再開可能な方法は、転送完了(終了)するまで KiiRTransferManager にて管理されます。この方法でアップロードしていると、転送途中にプロセスが停止しても転送が保持されるので、次にプロセス起動した際に途中から再開できます。次回は、アップロードしたファイルを公開する機能について紹介します。

参考URL

【Kii cloud リファレンスガイド】Object Body のアップロード
【Kii cloud リファレンスガイド】Object Body Operation