2014/03/24

Android:SAFの複数ファイル選択モードと要ログインサービスのために

Android4.4で導入されたStorageAccessFramework(SAF)について。
SAFが導入されたことでファイルブラウズ機能の提供が非常に手軽になりました。

SAFでは複数ファイル選択モードが具備されています。
当該モードを使用するにはIntent Extraとして下記を設定します。
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, flag);
SAFの選択UIでファイル名を長タップすることで、複数選択モードに移行します。

複数選択モードのonActivityResultについて。
単一選択モードではIntent の data に選択ファイルのURIが格納されますが、
複数選択モードではIntent の ClipData にURIが格納されています。
ClipData clip = data.getClipData();

Uri[] contentUri = new Uri[clip.getItemCount()];
for (int i = 0; i < clip.getItemCount(); i++) {
    contentUri[i] = clip.getItemAt(i).getUri();
}

話は変わって。

SAFのセキュリティについて。
SAFは対象のファイルがオンラインストレージ上にあるのか、ローカルストレージ上に
あるのかも隠蔽しようとします。
サービスによってはオンラインストレージ上のファイルを閲覧するのにログインを求めるケースがあります。
これをSAF上で実現するためには、DocumentProvider.queryRootを実装する際に
ユーザが非ログイン状態の場合は空のCursorを返すことで実現できます。
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
...
    if (!isServiceProvide()) {
        return emptyCursor;
}
サービス提供の状態に変化(非ログイン状態からログイン状態へ移行等)があった場合、
getContentResolver.notifyChangeによる変更通知により、SAFの情報を更新します。
setviceStateChanged();
getContentResolver().notifyChange(DocumentsContract
        .buildRootsUri(AUTHORITY), null);
以上です。