diff --git a/sdk-webview/src/main/java/com/xuqm/sdk/webview/XWebViewView.kt b/sdk-webview/src/main/java/com/xuqm/sdk/webview/XWebViewView.kt index fa48b27..2957acd 100644 --- a/sdk-webview/src/main/java/com/xuqm/sdk/webview/XWebViewView.kt +++ b/sdk-webview/src/main/java/com/xuqm/sdk/webview/XWebViewView.kt @@ -448,14 +448,28 @@ fun XWebViewView( // Validate that the selected file's actual MIME type is within the accepted list. // Some devices show extra file types in the picker (e.g. .doc when only .docx was // requested). Passing an unsupported type to the WebView renderer can cause a native - // crash. We accept the file only when its MIME type matches, or fall back to passing - // it through when we can't determine the type (to avoid blocking legitimate uploads). + // crash. val acceptedMimes = pendingAcceptMimes.value - val actualMime = context.contentResolver.getType(uri) + // ContentResolver returns "application/octet-stream" (or null) for most Office files + // from file-system / Downloads providers. Fall back to extension-based inference so + // .docx / .doc / .xls etc. are not incorrectly rejected. + val rawMime = context.contentResolver.getType(uri) + val actualMime: String? = if (rawMime == null || rawMime == "application/octet-stream") { + val name = context.contentResolver.query( + uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null + )?.use { cursor -> if (cursor.moveToFirst()) cursor.getString(0) else null } + val extMime = name?.substringAfterLast('.', "") + ?.lowercase(Locale.ROOT) + ?.takeIf { it.isNotEmpty() } + ?.let { ext -> MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) } + extMime ?: rawMime + } else rawMime val allowed = acceptedMimes.isNullOrEmpty() || acceptedMimes.any { accepted -> accepted == "*/*" || - (actualMime != null && (actualMime == accepted || actualMime.startsWith(accepted.substringBefore("*")))) + actualMime == null || // truly unknown type — don't block + actualMime == accepted || + actualMime.startsWith(accepted.substringBefore("*")) } if (!allowed) { android.util.Log.w("XWV", "Rejected file: actualMime=$actualMime not in accepted=$acceptedMimes")