From 6dfc729a8790c23d2efda4f21bab8123336ae383 Mon Sep 17 00:00:00 2001 From: Paulo Sergio Travaglia Date: Sat, 16 Jan 2016 20:43:18 -0200 Subject: [PATCH] Change method for getting external storage on marshmallow The new components/features introduced with marshmallow (vold 3.0) required a new method for retrieving external/removable storage devices These changes were based and use part of the following code: - Storage access implemented on Settings (uses VolumeInfo class to list all connected disks (external and emulated) see refresh method from class StorageSettings => packages/apps/Settings/src/com/android/settings/deviceinfo => StorageSettings.java - getVolumeList method from MountService class (converts VolumeInfo ArrayList item into a StorageVolume element, which is used by CMFileManager to iterate contents and build bookmarks): => frameworks/base/services/core/java/com/android/server/ => MountService.java --- .../filemanager/util/StorageHelper.java | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/util/StorageHelper.java b/src/com/cyanogenmod/filemanager/util/StorageHelper.java index ed07fd5..7c653d6 100644 --- a/src/com/cyanogenmod/filemanager/util/StorageHelper.java +++ b/src/com/cyanogenmod/filemanager/util/StorageHelper.java @@ -19,6 +19,12 @@ import android.content.Context; import android.os.Environment; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; +import android.os.storage.VolumeInfo; +import android.os.UserHandle; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; @@ -50,9 +56,22 @@ public final class StorageHelper { //IMP!! Android SDK doesn't have a "getVolumeList" but is supported by CM10. //Use reflect to get this value (if possible) try { + + final ArrayList res = new ArrayList<>(); + final int userId = UserHandle.myUserId(); + StorageManager sm = (StorageManager) ctx.getSystemService(Context.STORAGE_SERVICE); - Method method = sm.getClass().getMethod("getVolumeList"); //$NON-NLS-1$ - sStorageVolumes = (StorageVolume[])method.invoke(sm); + final List volumes = sm.getVolumes(); + Collections.sort(volumes, VolumeInfo.getDescriptionComparator()); + + for (VolumeInfo vol : volumes) { + if (vol.getType() == VolumeInfo.TYPE_PUBLIC || vol.getType() == VolumeInfo.TYPE_EMULATED) { + final StorageVolume userVol = vol.buildStorageVolume(ctx, userId, false); + res.add(userVol); + } + } + + sStorageVolumes = res.toArray(new StorageVolume[res.size()]); } catch (Exception ex) { //Ignore. Android SDK StorageManager class doesn't have this method -- 2.11.0