fix(webview): 解决文件选择器MIME类型解析和通知ID空指针问题

- 修复了文件下载通知中notifId为空时的崩溃问题
- 为XWebViewJsBridge添加了额外的回调参数以支持消息处理
- 重构了resolvePickerMimeType函数的文档注释并优化了MIME类型解析逻辑
- 将文件选择器的MIME类型解析逻辑统一到resolvePickerMimeType函数中
- 改进了HTML accept类型的转换机制,更好地支持混合和未知MIME类型
这个提交包含在:
XuqmGroup 2026-06-05 15:53:51 +08:00
父节点 0ce2f21307
当前提交 d19b0ae8fc
共有 3 个文件被更改,包括 11 次插入13 次删除

查看文件

@ -190,12 +190,15 @@ object FileSDK {
.also { NotificationManagerCompat.from(context).notify(id, it.build()) }
}
val capturedNotifId = notifId
try {
FileTransfer.downloadToFile(downloadUrl, target) { progress ->
notifBuilder?.let { builder ->
builder.setProgress(100, progress, false)
if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {
NotificationManagerCompat.from(context).notify(notifId!!, builder.build())
if (capturedNotifId != null) {
notifBuilder?.let { builder ->
builder.setProgress(100, progress, false)
if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {
NotificationManagerCompat.from(context).notify(capturedNotifId, builder.build())
}
}
}
onProgress(progress)

查看文件

@ -100,7 +100,7 @@ class XWebViewActivity : ComponentActivity() {
config.userAgent?.let { settings.userAgentString = it }
addJavascriptInterface(
XWebViewJsBridge(mainHandler) { config.onMessage },
XWebViewJsBridge(mainHandler, { config.onMessage }, { null }),
config.jsBridgeName,
)
@ -155,9 +155,7 @@ class XWebViewActivity : ComponentActivity() {
fileCameraPermissionLauncher.launch(Manifest.permission.CAMERA)
}
} else {
val mimeType = fileChooserParams.acceptTypes
.firstOrNull { it.isNotBlank() } ?: "image/*"
pickContentLauncher.launch(mimeType)
pickContentLauncher.launch(resolvePickerMimeType(fileChooserParams.acceptTypes))
}
return true
}

查看文件

@ -42,11 +42,8 @@ import org.json.JSONObject
import java.io.File
import java.util.Locale
/**
* Converts an array of HTML accept types (MIME types or dot-prefixed extensions like ".docx")
* into a single MIME type string suitable for ACTION_GET_CONTENT.
* Falls back to "*\/*" when types are mixed, unknown, or empty.
*/
// Maps HTML accept types (MIME or dot-prefixed extensions) to a single MIME for ACTION_GET_CONTENT.
// Returns "*/*" when types are empty, mixed, or cannot be resolved.
internal fun resolvePickerMimeType(acceptTypes: Array<String>): String {
val nonBlank = acceptTypes.filter { it.isNotBlank() }
if (nonBlank.isEmpty()) return "*/*"