2013/02/24

マルチユーザ環境でSDカードのディレクトリをユーザ毎に分ける

先日、Android のマルチユーザ環境で ユーザID を取得する というエントリを書きました。
その中で、マルチユーザーを意識しなければならない例として、
例えば、「SDカードにデータを保存せざるを得ないが、ユーザは分けたい」場合とか。
と書いたのですがSDカード(外部ストレージ)への保存も適切な方法を用いれば特にマルチユーザーユーザを意識する必要はないようです。

具体的には、マルチユーザであっても、シングルユーザと同様、getExternalFilesDir() 等を使ってディレクトリを取得すれば、各ユーザ毎に割り振られたディレクトリを取得出来ます。
参考: 穀風: AndroidアプリのデータはSDカードのどこに保存すべきか?

Nexus 7 上に2人のユーザ(所有者+1)を作成し、以下のコードを実行してみました。
(実行するには、AndroidManifest に android.permission.WRITE_EXTERNAL_STORAGE の記述が必要です。)
UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
UserHandle handle = Process.myUserHandle();

Log.d(TAG, "uid                               : " + Process.myUid());
Log.d(TAG, "serialNumber                      : " + userManager.getSerialNumberForUser(handle));
Log.d(TAG, "getFilesDir                       : " + getFilesDir());
Log.d(TAG, "getExternalFilesDir               : " + getExternalFilesDir(null));
Log.d(TAG, "getExternalCacheDir               : " + getExternalCacheDir());
Log.d(TAG, "getExternalStorageDirectory       : " + Environment.getExternalStorageDirectory());
Log.d(TAG, "getExternalStoragePublicDirectory : " + Environment.getExternalStoragePublicDirectory(""));

結果は以下です。
所有者
uid                               : 10064
serialNumber                      : 0
getFilesDir                       : /data/data/com.kokufu.android.test.multipleusertest/files
getExternalFilesDir               : /storage/emulated/0/Android/data/com.kokufu.android.test.multipleusertest/files
getExternalCacheDir               : /storage/emulated/0/Android/data/com.kokufu.android.test.multipleusertest/cache
getExternalStorageDirectory       : /storage/emulated/0
getExternalStoragePublicDirectory : /storage/emulated/0

ユーザ1
uid                               : 1010064
serialNumber                      : 12
getFilesDir                       : /data/user/10/com.kokufu.android.test.multipleusertest/files
getExternalFilesDir               : /storage/emulated/10/Android/data/com.kokufu.android.test.multipleusertest/files
getExternalCacheDir               : /storage/emulated/10/Android/data/com.kokufu.android.test.multipleusertest/cache
getExternalStorageDirectory       : /storage/emulated/10
getExternalStoragePublicDirectory : /storage/emulated/10

各ユーザ毎に外部ストレージが作成されているのがわかります。
逆に言うと、ユーザ間で外部ストレージを共有することは出来ないということですね。

0 件のコメント: