diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 321199066..3927e2b86 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -963,11 +963,19 @@ interface JsExtensions : JsEncodeUtils { return AppConst.androidId } - fun openUrl(url: String) { + // 新增 mimeType 参数,默认为 null(保持兼容性) + fun openUrl(url: String, mimeType: String? = null) { try { val intent = Intent(appCtx, ConfirmationDialogActivity::class.java).apply { - data = Uri.parse(url) - putExtra("sourceTag", getSource()?.getTag() ?: "") // 添加来源标签参数 + // 同时设置 Data 和 Type(避免单独设置 data/type 导致冲突) + if (mimeType != null) { + setDataAndType(Uri.parse(url), mimeType) + } else { + data = Uri.parse(url) + } + putExtra("sourceTag", getSource()?.getTag() ?: "") + // 可选:添加 MIME 类型到 Extra 供后续逻辑使用 + putExtra("mimeType", mimeType) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } appCtx.startActivity(intent) @@ -976,4 +984,5 @@ interface JsExtensions : JsEncodeUtils { appCtx.toastOnUi("启动跳转确认失败") } } + } diff --git a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt index 0f0d1b508..e212ba2f6 100644 --- a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt +++ b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt @@ -2,7 +2,6 @@ package io.legado.app.ui.javascript import android.content.ActivityNotFoundException import android.content.Intent -import android.net.Uri import android.os.Bundle import android.widget.TextView import androidx.appcompat.widget.Toolbar @@ -12,22 +11,21 @@ import io.legado.app.constant.AppLog import io.legado.app.ui.widget.text.AccentTextView import io.legado.app.utils.toastOnUi - class ConfirmationDialogActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // 必须先设置布局再获取控件 setContentView(R.layout.confirmation_dialog) - // 正确顺序:先设置布局再获取视图 val messageView = findViewById(R.id.message) - val toolbar = findViewById(R.id.toolbar) + val toolbar = findViewById(R.id.tool_bar) val btnNegative = findViewById(R.id.btn_negative) val btnPositive = findViewById(R.id.btn_positive) - val url = intent?.dataString - if (url.isNullOrBlank()) { + // 获取原始 Intent 的数据和 MIME 类型 + val uri = intent?.data + val mimeType = intent?.getStringExtra("mimeType") + if (uri == null) { finish() return } @@ -36,16 +34,27 @@ class ConfirmationDialogActivity : AppCompatActivity() { val sourceTag = intent.getStringExtra("sourceTag").takeIf { !it.isNullOrBlank() } ?: "当前来源" messageView.text = "$sourceTag 正在请求跳转外部链接/应用,是否跳转?" - // 设置其他组件 toolbar.setNavigationOnClickListener { finish() } btnNegative.setOnClickListener { finish() } btnPositive.setOnClickListener { try { - startActivity( - Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + // 创建目标 Intent 并设置类型 + val targetIntent = Intent(Intent.ACTION_VIEW).apply { + // 同时设置 Data 和 Type + if (!mimeType.isNullOrBlank()) { + setDataAndType(uri, mimeType) + } else { + data = uri } - ) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + // 验证是否有应用可以处理 + if (targetIntent.resolveActivity(packageManager) != null) { + startActivity(targetIntent) + } else { + toastOnUi(R.string.can_not_open) + } } catch (e: ActivityNotFoundException) { toastOnUi(R.string.can_not_open) } catch (e: Exception) { diff --git a/app/src/main/res/layout/confirmation_dialog.xml b/app/src/main/res/layout/confirmation_dialog.xml index f1829047a..26c768c6d 100644 --- a/app/src/main/res/layout/confirmation_dialog.xml +++ b/app/src/main/res/layout/confirmation_dialog.xml @@ -14,7 +14,7 @@ android:orientation="vertical"> + android:textAppearance="?attr/textAppearanceBodyMedium" + android:textColor="@color/primaryText" /> 20sp + @color/primaryText //*******************Widget Style**********************************//