From 96a4d20d22587b251960c75c0566143446d718be Mon Sep 17 00:00:00 2001 From: AbhayDas Damodaran <4bhay.exe@gmail.com> Date: Thu, 27 Nov 2025 01:28:31 +0530 Subject: [PATCH] Fix: Android 10 'Failed to save' error due to path handling in Scoped Storage API29 is strict with path format in Scoped Storage! It requires trailing '/' and fails if '//' is present! So '/' is trimmed from base path to prevent '//' and manually added trailing '/' to the final path --- .../wsstatussaver/repository/StatusesRepository.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/simplified/wsstatussaver/repository/StatusesRepository.kt b/app/src/main/java/com/simplified/wsstatussaver/repository/StatusesRepository.kt index a56c535..40ec380 100644 --- a/app/src/main/java/com/simplified/wsstatussaver/repository/StatusesRepository.kt +++ b/app/src/main/java/com/simplified/wsstatussaver/repository/StatusesRepository.kt @@ -396,9 +396,19 @@ class StatusesRepositoryImpl( private fun saveStatus(status: StatusEntity, inputStream: InputStream, notify: Boolean): SavedStatus? { if (IsScopedStorageRequired) { val contentUri = status.type.contentUri + // Fix: Android 10 'Failed to save' error due to path handling in Scoped storage + // Trailing '/' is trimmed + val rawOriginalPath = status.type.getRelativePath(statusSaveLocation).trim('/') + // Manually add the '/' between path parts to avoid '//' + val finalPath = if (statusSaveLocation == SaveLocation.DCIM) { + "$rawOriginalPath/$APP_SAVE_SUBFOLDER/" // Trailing slash is added! + } else { + "$rawOriginalPath/" // Trailing slash is added! + } + val contentValues = contentValuesOf( MediaColumns.DISPLAY_NAME to status.saveName, - MediaColumns.RELATIVE_PATH to status.type.getRelativePath(statusSaveLocation), + MediaColumns.RELATIVE_PATH to finalPath, MediaColumns.MIME_TYPE to status.type.mimeType ) var uri: Uri? = null