Create DirectoryUtils.java
This commit is contained in:
parent
2ffee347f0
commit
c361bc8550
@ -0,0 +1,76 @@
|
|||||||
|
package awais.instagrabber.utils;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Environment;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class DirectoryUtils {
|
||||||
|
private static final Pattern DIR_SEPORATOR = Pattern.compile("/");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From: https://stackoverflow.com/a/18871043/1436766
|
||||||
|
*
|
||||||
|
* Returns all available SD-Cards in the system (include emulated)
|
||||||
|
* <p>
|
||||||
|
* Warning: Hack! Based on Android source code of version 4.3 (API 18)
|
||||||
|
* Because there is no standard way to get it.
|
||||||
|
* TODO: Test on future Android versions 4.4+
|
||||||
|
*
|
||||||
|
* @return paths to all available SD-Cards in the system (include emulated)
|
||||||
|
*/
|
||||||
|
public static Set<String> getStorageDirectories() {
|
||||||
|
// Final set of paths
|
||||||
|
final Set<String> rv = new HashSet<>();
|
||||||
|
// Primary physical SD-CARD (not emulated)
|
||||||
|
final String rawExternalStorage = System.getenv("EXTERNAL_STORAGE");
|
||||||
|
// All Secondary SD-CARDs (all exclude primary) separated by ":"
|
||||||
|
final String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");
|
||||||
|
// Primary emulated SD-CARD
|
||||||
|
final String rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET");
|
||||||
|
if (TextUtils.isEmpty(rawEmulatedStorageTarget)) {
|
||||||
|
// Device has physical external storage; use plain paths.
|
||||||
|
if (TextUtils.isEmpty(rawExternalStorage)) {
|
||||||
|
// EXTERNAL_STORAGE undefined; falling back to default.
|
||||||
|
rv.add("/storage/sdcard0");
|
||||||
|
} else {
|
||||||
|
rv.add(rawExternalStorage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Device has emulated storage; external storage paths should have
|
||||||
|
// userId burned into them.
|
||||||
|
final String rawUserId;
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||||
|
rawUserId = "";
|
||||||
|
} else {
|
||||||
|
final String path = Environment.getExternalStorageDirectory().getAbsolutePath();
|
||||||
|
final String[] folders = DIR_SEPORATOR.split(path);
|
||||||
|
final String lastFolder = folders[folders.length - 1];
|
||||||
|
boolean isDigit = false;
|
||||||
|
try {
|
||||||
|
Integer.valueOf(lastFolder);
|
||||||
|
isDigit = true;
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
}
|
||||||
|
rawUserId = isDigit ? lastFolder : "";
|
||||||
|
}
|
||||||
|
// /storage/emulated/0[1,2,...]
|
||||||
|
if (TextUtils.isEmpty(rawUserId)) {
|
||||||
|
rv.add(rawEmulatedStorageTarget);
|
||||||
|
} else {
|
||||||
|
rv.add(rawEmulatedStorageTarget + File.separator + rawUserId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add all secondary storages
|
||||||
|
if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) {
|
||||||
|
// All Secondary SD-CARDs splited into array
|
||||||
|
final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
|
||||||
|
Collections.addAll(rv, rawSecondaryStorages);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user