diff options
author | Jeff Sharkey <jsharkey@android.com> | 2015-08-14 14:42:56 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2015-08-14 14:43:05 -0700 |
commit | cba15caa4ee3f5948140d6fde91518f3f263f5b4 (patch) | |
tree | 987377eef2289fddd314e71487f848bc3e89c967 /src/com/android/providers | |
parent | f94b8b8a31ed2eee8350728abadee567c44ea58c (diff) | |
download | android_packages_providers_MediaProvider-cba15caa4ee3f5948140d6fde91518f3f263f5b4.tar.gz android_packages_providers_MediaProvider-cba15caa4ee3f5948140d6fde91518f3f263f5b4.tar.bz2 android_packages_providers_MediaProvider-cba15caa4ee3f5948140d6fde91518f3f263f5b4.zip |
Update primary storage paths when volumes change.
Devices that use physical media as their primary storage may not
have that storage mounted by the time that MediaProvider is started,
which means we'd snapshot a stale primary storage path.
To fix this, refresh those paths as volumes are mounted or unmounted
over time. Also fix logic that detects secondary storage devices.
Bug: 22629557
Change-Id: I3c6b057ce082318e1b28e261c953a436da42e36f
Diffstat (limited to 'src/com/android/providers')
-rwxr-xr-x | src/com/android/providers/media/MediaProvider.java | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java index 0bbba768..271aa807 100755 --- a/src/com/android/providers/media/MediaProvider.java +++ b/src/com/android/providers/media/MediaProvider.java @@ -128,19 +128,21 @@ public class MediaProvider extends ContentProvider { private static final HashMap<String, String> sFolderArtMap = new HashMap<String, String>(); /** Resolved canonical path to external storage. */ - private static final String sExternalPath; + private String mExternalPath; /** Resolved canonical path to cache storage. */ - private static final String sCachePath; + private String mCachePath; /** Resolved canonical path to legacy storage. */ - private static final String sLegacyPath; + private String mLegacyPath; + + private void updateStoragePaths() { + mExternalStoragePaths = mStorageManager.getVolumePaths(); - static { try { - sExternalPath = + mExternalPath = Environment.getExternalStorageDirectory().getCanonicalPath() + File.separator; - sCachePath = + mCachePath = Environment.getDownloadCacheDirectory().getCanonicalPath() + File.separator; - sLegacyPath = + mLegacyPath = Environment.getLegacyExternalStorageDirectory().getCanonicalPath() + File.separator; } catch (IOException e) { @@ -4695,7 +4697,7 @@ public class MediaProvider extends ContentProvider { == PackageManager.PERMISSION_GRANTED); } - if (path.startsWith(sExternalPath) || path.startsWith(sLegacyPath)) { + if (path.startsWith(mExternalPath) || path.startsWith(mLegacyPath)) { if (isWrite) { if (!writeGranted) { enforceCallingOrSelfPermissionAndAppOps( @@ -4705,7 +4707,7 @@ public class MediaProvider extends ContentProvider { enforceCallingOrSelfPermissionAndAppOps( READ_EXTERNAL_STORAGE, "External path: " + path); } - } else if (path.startsWith(sCachePath)) { + } else if (path.startsWith(mCachePath)) { if ((isWrite && !writeGranted) || !readGranted) { c.enforceCallingOrSelfPermission(ACCESS_CACHE_FILESYSTEM, "Cache path: " + path); } @@ -4734,7 +4736,7 @@ public class MediaProvider extends ContentProvider { } private boolean isSecondaryExternalPath(String path) { - for (int i = mExternalStoragePaths.length - 1; i >= 0; --i) { + for (int i = 1; i < mExternalStoragePaths.length; i++) { if (path.startsWith(mExternalStoragePaths[i])) { return true; } @@ -5334,7 +5336,7 @@ public class MediaProvider extends ContentProvider { } // Update paths to reflect currently mounted volumes - mExternalStoragePaths = mStorageManager.getVolumePaths(); + updateStoragePaths(); synchronized (mDatabases) { if (mDatabases.get(volume) != null) { // Already attached @@ -5477,7 +5479,7 @@ public class MediaProvider extends ContentProvider { } // Update paths to reflect currently mounted volumes - mExternalStoragePaths = mStorageManager.getVolumePaths(); + updateStoragePaths(); String volume = uri.getPathSegments().get(0); if (INTERNAL_VOLUME.equals(volume)) { |