diff --git a/src/main/java/org/thoughtcrime/securesms/providers/PersistentBlobProvider.java b/src/main/java/org/thoughtcrime/securesms/providers/PersistentBlobProvider.java index 0a85bc73e..460da70d3 100644 --- a/src/main/java/org/thoughtcrime/securesms/providers/PersistentBlobProvider.java +++ b/src/main/java/org/thoughtcrime/securesms/providers/PersistentBlobProvider.java @@ -122,8 +122,26 @@ private void persistToDisk(@NonNull Context context, } public Uri createForExternal(@NonNull Context context, @NonNull String mimeType) throws IOException, IllegalStateException, NullPointerException { - File target = new File(getExternalDir(context), System.currentTimeMillis() + "." + getExtensionFromMimeType(mimeType)); - return FileProviderUtil.getUriFor(context, target); + String filename = System.currentTimeMillis() + "." + getExtensionFromMimeType(mimeType); + + // Try external cache first + try { + File externalDir = getExternalDir(context); + File target = new File(externalDir, filename); + return FileProviderUtil.getUriFor(context, target); + } catch (IllegalArgumentException e) { + // FileProvider doesn't support the external cache path (e.g., on removable SD card). + // Note: getExternalDir() already falls back to internal cache when external cache is null, + // but when external cache exists on a removable SD card, FileProvider may reject it. + // In that case, we explicitly use internal cache which FileProvider always supports. + Log.w(TAG, "FileProvider doesn't support external cache path, falling back to internal cache", e); + File internalDir = context.getCacheDir(); + if (internalDir == null) { + throw new IOException("no cache directory available"); + } + File target = new File(internalDir, filename); + return FileProviderUtil.getUriFor(context, target); + } } public boolean delete(@NonNull Context context, @NonNull Uri uri) { diff --git a/src/main/res/xml/file_provider_paths.xml b/src/main/res/xml/file_provider_paths.xml index 77df3dcae..00c8530e3 100644 --- a/src/main/res/xml/file_provider_paths.xml +++ b/src/main/res/xml/file_provider_paths.xml @@ -1,5 +1,6 @@ +