Android での実装における注意点

Android でモバイルアプリを実装する際には以下の点に注意してください。

SDK がメモリに保持する情報の保存と復元

モバイルアプリがバックグラウンドに遷移したり言語設定が変更されたりすると、モバイルアプリや Activity などのインスタンスが Android のシステムによって再生成されます。その際に Kii Cloud SDK がメモリ上に保持しているログインユーザーなどの情報は失われます。

インスタンスが再生成される際に Kii Cloud SDK に関する情報を復元させるには、Activity に用意されている Activity#onSaveInstanceState 内で Kii#onSaveInstanceState メソッドを実行してください。これによって Android のシステムで復元に必要な情報が保持され、再生成の際に Activity#onCreate へ復元に必要な情報が渡されます。

そして Kii Cloud SDK がメモリ上に保持していた情報を復元するには、Kii#onRestoreInstanceState メソッドを実行してください。

Kii Cloud SDK がメモリ上に保持している情報を保存・復元する例を以下に挙げます。

public class AppActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Restore the Kii state information.
    Kii.onRestoreInstanceState(savedInstanceState);

    setContentView(R.layout.activity_second);
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // Save the Kii state information.
    Kii.onSaveInstanceState(outState);
  }

}

注意:この機能では Bundle のキーに "com.kii.cloud.storage.*" を利用します。Activity#onSaveInstanceState で他のインスタンスの状態を保存している場合は、これらのキーを利用しないでください。

上記の例では Activity#onCreate で復元していますが、Activity#onRestoreInstanceState で復元することも可能です。

なお、アクティビティのライフサイクルについては Google による アクティビティのライフサイクル管理 を参照してください。

実行時パーミッションの取得

Android 6.0 以降(API レベル 23 以降)では、実行時にパーミッションを取得する仕組みが提供されています。

Kii Cloud では、Object Body のアップロードやダウンロードを行う際、外部記憶装置にアクセスします。アクセス先としてアプリケーションのデータディレクトリ("/Android/data/パッケージ名" 以下)以外を指定した場合には、ユーザーの許可が必要です。

Android 6.0 未満の環境では、Kii Cloud SDK の導入手順で実施した AndroidManifest.xml の変更 を行えば、アプリケーションのインストール時にユーザーの許可を取得してアクセスできます。Android 6.0 以降では、これに加えて、実行時にユーザーインターフェイスを表示してパーミッションを取得する処理を実装する必要があります。

以下に WRITE_EXTERNAL_STORAGE 権限を実行時に取得するサンプルコードを示します。READ_EXTERNAL_STORAGE 権限も同様に取得できます。

int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
  ActivityCompat.requestPermissions(this,
       new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
       REQUEST_CODE_PERMISSION);
} else {
  // The user granted the permission.
}

はじめに、checkSelfPermission() メソッドによって、すでに権限が取得済みかどうかを確認します。戻り値が PackageManager.PERMISSION_GRANTED ではない場合はまだ権限を持っていないため、requestPermissions() メソッドによってユーザーインターフェイスを表示し、権限を取得します。

サンプルコード中の this はアクティビティのインスタンスを表します。

REQUEST_CODE_PERMISSION は、ユーザーの入力結果が返される際、onRequestPermissionsResult() メソッドに渡されるリクエストコードです。他のリクエストコードと重複しない値を使用します。

private static final REQUEST_CODE_PERMISSION = 1000;

requestPermissions() メソッドが実行されると、ユーザーは画面操作により、権限を許可するか、拒否するかを指定できます。指定した結果は onRequestPermissionsResult() メソッドで通知されます。

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
  switch (requestCode) {
    case REQUEST_CODE_PERMISSION: {
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // The user granted the permission.
      } else {
        // The user canceled the choice or denied the permission.
      }
      return;
    }
  }
}

メソッドが呼び出された際のリクエストコードが、requestPermissions() メソッドで指定した値と同じであれば、パーミッションの取得結果を確認します。

grantResults が長さ 0 の配列の場合、ユーザーがキャンセルしたことを意味します。1 以上で、かつ許可を表す PackageManager.PERMISSION_GRANTED が返された場合は、ユーザーの許可が得られたことを表します。

上記のサンプルコード中、// The user granted the permission. の記載がある 2 箇所では、パーミッションが得られており、Object Body にアクセスできます。権限が得られなかった場合、Kii Cloud SDK の API はエラーを返すため、API を実行しないように機能制限を行うのが理想的です。

なお、Google の 公式ドキュメント では、shouldShowRequestPermissionRationale() メソッドを使ってパーミッションが必要な理由を説明する方法なども記載されているため、参考にしてください。