diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index 6df58a369ac..950dd3aa728 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.7+2 + +* Fixes a crash case when picking an image with a display name that does not contain a period. + ## 0.8.7+1 * Bumps org.jetbrains.kotlin:kotlin-bom from 1.8.21 to 1.8.22. diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java index df229d8cefb..8afed83aaef 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java @@ -137,7 +137,11 @@ private static void copy(InputStream in, OutputStream out) throws IOException { } private static String getBaseName(String fileName) { + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex < 0) { + return fileName; + } // Basename is everything before the last '.'. - return fileName.substring(0, fileName.lastIndexOf('.')); + return fileName.substring(0, lastDotIndex); } } diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java index 06315f99f99..620bac74a17 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java @@ -109,6 +109,16 @@ public void FileUtil_getImageName() throws IOException { assertTrue(path.endsWith("a.b.png")); } + @Test + public void FileUtil_getPathFromUri_noExtensionInBaseName() throws IOException { + Uri uri = MockContentProvider.NO_EXTENSION_URI; + Robolectric.buildContentProvider(MockContentProvider.class).create("dummy"); + shadowContentResolver.registerInputStream( + uri, new ByteArrayInputStream("imageStream".getBytes(UTF_8))); + String path = fileUtils.getPathFromUri(context, uri); + assertTrue(path.endsWith("abc.png")); + } + @Test public void FileUtil_getImageName_mismatchedType() throws IOException { Uri uri = MockContentProvider.WEBP_URI; @@ -133,6 +143,7 @@ private static class MockContentProvider extends ContentProvider { public static final Uri PNG_URI = Uri.parse("content://dummy/a.b.png"); public static final Uri WEBP_URI = Uri.parse("content://dummy/c.d.png"); public static final Uri UNKNOWN_URI = Uri.parse("content://dummy/e.f.g"); + public static final Uri NO_EXTENSION_URI = Uri.parse("content://dummy/abc"); @Override public boolean onCreate() { @@ -157,6 +168,7 @@ public Cursor query( public String getType(@NonNull Uri uri) { if (uri.equals(PNG_URI)) return "image/png"; if (uri.equals(WEBP_URI)) return "image/webp"; + if (uri.equals(NO_EXTENSION_URI)) return "image/png"; return null; } diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index e8787d1760d..c746bc68749 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -3,7 +3,7 @@ description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.7+1 +version: 0.8.7+2 environment: sdk: ">=2.18.0 <4.0.0"