From 76680cf32b2fa284a132d3300111d4fb6bcacf00 Mon Sep 17 00:00:00 2001 From: Andrew Shini Date: Tue, 7 Mar 2017 13:20:55 +1000 Subject: [PATCH] Fix resolving external storage paths --- .../ivpusic/imagepicker/RealPathUtil.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java index 184ebef..65c54c7 100644 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java +++ b/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java @@ -8,6 +8,8 @@ import android.provider.DocumentsContract; import android.provider.MediaStore; import android.content.ContentUris; import android.os.Environment; +import android.support.annotation.RequiresApi; +import java.io.File; public class RealPathUtil { public static String getRealPathFromURI(final Context context, final Uri uri) { @@ -22,7 +24,23 @@ public class RealPathUtil { final String[] split = docId.split(":"); final String type = split[0]; - return Environment.getExternalStorageDirectory() + "/" + split[1]; + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } else { + final int splitIndex = docId.indexOf(':', 1); + final String tag = docId.substring(0, splitIndex); + final String path = docId.substring(splitIndex + 1); + + String nonPrimaryVolume = getPathToNonPrimaryVolume(context, tag); + if (nonPrimaryVolume != null) { + String result = nonPrimaryVolume + "/" + path; + File file = new File(result); + if (file.exists() && file.canRead()) { + return result; + } + return null; + } + } } // DownloadsProvider else if (isDownloadsDocument(uri)) { @@ -139,4 +157,23 @@ public class RealPathUtil { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } + @RequiresApi(Build.VERSION_CODES.KITKAT) + public static String getPathToNonPrimaryVolume(Context context, String tag) { + File[] volumes = context.getExternalCacheDirs(); + if (volumes != null) { + for (File volume : volumes) { + if (volume != null) { + String path = volume.getAbsolutePath(); + if (path != null) { + int index = path.indexOf(tag); + if (index != -1) { + return path.substring(0, index) + tag; + } + } + } + } + } + return null; + } + }