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