diff options
| author | Jeff Sharkey <jsharkey@android.com> | 2013-09-17 17:30:33 -0700 |
|---|---|---|
| committer | Jeff Sharkey <jsharkey@android.com> | 2013-09-20 14:34:02 -0700 |
| commit | 2d8b4e801332e02d6aad615b85cc9dd056ef805c (patch) | |
| tree | 8100d77b8cef8d1b11ed366006b1035706640400 /core/java/android/app/ContextImpl.java | |
| parent | 6df7d4a574ffd85c82cad402552e3854df3a3f85 (diff) | |
| download | frameworks_base-2d8b4e801332e02d6aad615b85cc9dd056ef805c.zip frameworks_base-2d8b4e801332e02d6aad615b85cc9dd056ef805c.tar.gz frameworks_base-2d8b4e801332e02d6aad615b85cc9dd056ef805c.tar.bz2 | |
Delegate mkdirs() to vold when lacking perms.
Apps without sdcard_r or sdcard_rw are still able to write to
their package-specific directory, but someone needs to first make
that directory on their behalf. This change will delegate the
mkdirs() call through to vold when an app fails to create directly.
MountService validates that the path belongs to the calling user, and
that it's actually on external storage, before passing to vold.
Update Environment to make app-vs-vold paths clearer.
Bug: 10577808
Change-Id: I43b4a77fd6d2b9af2a0d899790da8d9d89386776
Diffstat (limited to 'core/java/android/app/ContextImpl.java')
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 8e9f3bb..0ba2ac5 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -92,6 +92,7 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.os.SystemVibrator; import android.os.UserManager; +import android.os.storage.IMountService; import android.os.storage.StorageManager; import android.print.IPrintManager; import android.print.PrintManager; @@ -864,7 +865,9 @@ class ContextImpl extends Context { if (mExternalObbDirs == null) { mExternalObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName()); } - return mExternalObbDirs; + + // Create dirs if needed + return ensureDirsExistOrFilter(mExternalObbDirs); } } @@ -2127,14 +2130,25 @@ class ContextImpl extends Context { * Ensure that given directories exist, trying to create them if missing. If * unable to create, they are filtered by replacing with {@code null}. */ - private static File[] ensureDirsExistOrFilter(File[] dirs) { + private File[] ensureDirsExistOrFilter(File[] dirs) { File[] result = new File[dirs.length]; for (int i = 0; i < dirs.length; i++) { File dir = dirs[i]; if (!dir.exists()) { if (!dir.mkdirs()) { - Log.w(TAG, "Failed to ensure directory: " + dir); - dir = null; + // Failing to mkdir() may be okay, since we might not have + // enough permissions; ask vold to create on our behalf. + final IMountService mount = IMountService.Stub.asInterface( + ServiceManager.getService("mount")); + int res = -1; + try { + res = mount.mkdirs(getPackageName(), dir.getAbsolutePath()); + } catch (RemoteException e) { + } + if (res != 0) { + Log.w(TAG, "Failed to ensure directory: " + dir); + dir = null; + } } } result[i] = dir; |
