From 9be3406d5221665d10ea8281398c52d832898362 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 11 Mar 2026 13:03:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(share):=20=E4=BC=98=E5=8C=96QQ=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E5=9C=A8=E7=B3=BB=E7=BB=9F=E9=9D=A2=E6=9D=BF=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=AE=B9=E9=94=99=E6=8B=89=E8=B5=B7=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 引入了 resolveShareComponent 动态解析指定包内真实的 ACTION_SEND 接收组件。 2. 抛弃原本硬编码的 JumpActivity 这种由于某些系统内部拉起问题可能报错导致失败的方案。 3. 如果指定 Component 和解析失败则直接兜底进入单纯的 setPackage 调用即可完成精确跳转。 --- .../tsgame_niuniu/util/QQIntentShareUtil.java | 189 ++++++++---------- 1 file changed, 86 insertions(+), 103 deletions(-) diff --git a/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java b/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java index f1aa286..531b90d 100644 --- a/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java +++ b/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java @@ -58,6 +58,24 @@ public class QQIntentShareUtil { private static final String QZONE_COMPONENT = "com.tencent.mobileqq.activity.QzonePublishMoodActivity"; private static final String TIM_QZONE_COMPONENT = "com.tencent.tim.activity.QzonePublishMoodActivity"; + /** + * 动态获取分享组件(适配鸿蒙等定制系统) + */ + private ComponentName resolveShareComponent(Activity activity, Intent intent, String packageName) { + try { + List resolveInfoList = + activity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (resolveInfoList != null && !resolveInfoList.isEmpty()) { + for (android.content.pm.ResolveInfo resolveInfo : resolveInfoList) { + if (packageName.equals(resolveInfo.activityInfo.packageName)) { + return new ComponentName(packageName, resolveInfo.activityInfo.name); + } + } + } + } catch (Exception e) {} + return null; + } + private static QQIntentShareUtil instance; private final Context mContext; private QQShareCallback mCallback; @@ -222,7 +240,7 @@ public class QQIntentShareUtil { String packageName = getInstalledQQPackage(); boolean launched = false; - // 方法1: 尝试使用系统Chooser,这是最兼容的方式,特别适合鸿蒙环境 + // 方法1: 尝试直接拉起 try { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); @@ -231,32 +249,18 @@ public class QQIntentShareUtil { // 鸿蒙/卓易通关键适配Flags intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + + String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; + ComponentName resolvedComp = resolveShareComponent(activity, intent, targetPackage); - // 如果检测到了包名,优先尝试指定包名,但不是必须的 - if (isPackageDetected) { - try { - Intent directIntent = new Intent(intent); - ComponentName comp = new ComponentName(packageName, getQQShareComponent()); - directIntent.setComponent(comp); - activity.startActivity(directIntent); - launched = true; - } catch (Exception e) { - Log.e(TAG, "直接拉起QQ文本分享失败: " + e.getMessage()); - } + if (resolvedComp != null) { + intent.setComponent(resolvedComp); + } else { + intent.setPackage(targetPackage); } - if (!launched) { - // 没有检测到包名,更需要使用Chooser,并提示用户选择QQ - if (packageName != null && !packageName.isEmpty()) { - intent.setPackage(packageName); - } else { - intent.setPackage(QQ_PACKAGE_NAME); // 强制限制为QQ包名,防止出现抖音等其他应用 - } - Intent chooser = Intent.createChooser(intent, "请选择QQ进行分享"); - chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(chooser); - launched = true; - } + activity.startActivity(intent); + launched = true; Log.d(TAG, "成功启动分享"); activity.runOnUiThread(() -> Toast.makeText(activity, "已将内容复制到剪贴板,请在QQ中粘贴并分享", Toast.LENGTH_LONG).show()); @@ -334,17 +338,20 @@ public class QQIntentShareUtil { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, text); - + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + String packageName = getInstalledQQPackage(); - if (packageName != null && !packageName.isEmpty()) { - intent.setPackage(packageName); + String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; + + ComponentName resolvedComp = resolveShareComponent(activity, intent, targetPackage); + if (resolvedComp != null) { + intent.setComponent(resolvedComp); } else { - intent.setPackage(QQ_PACKAGE_NAME); + intent.setPackage(targetPackage); } - Intent chooser = Intent.createChooser(intent, "分享到QQ空间"); - activity.startActivity(chooser); - Toast.makeText(activity, "已将内容复制到剪贴板,请从列表中选择QQ并粘贴分享", Toast.LENGTH_LONG).show(); + activity.startActivity(intent); + Toast.makeText(activity, "已将内容复制到剪贴板,请从打开的界面中粘贴分享", Toast.LENGTH_LONG).show(); if (mCallback != null) { new Handler(Looper.getMainLooper()).postDelayed(() -> { @@ -403,41 +410,24 @@ public class QQIntentShareUtil { // 尝试直接拉起 boolean launched = false; - if (isPackageDetected) { - try { - // 复制一份Intent用于尝试 - Intent directIntent = new Intent(shareIntent); - ComponentName comp = new ComponentName(packageName, getQQShareComponent()); - directIntent.setComponent(comp); - activity.startActivity(directIntent); - launched = true; - Log.d(TAG, "已发送分享图片Intent到QQ"); - activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享图片Intent到QQ", Toast.LENGTH_SHORT).show()); - } catch (Exception e) { - Log.e(TAG, "直接分享到QQ失败: " + e.getMessage()); - final String failMsg = "直接分享失败: " + e.getMessage(); - activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show()); - } - } - - // 如果直接拉起失败,或者未检测到包名,使用Chooser - if (!launched) { - try { - if (packageName != null && !packageName.isEmpty()) { - shareIntent.setPackage(packageName); - } else { - shareIntent.setPackage(QQ_PACKAGE_NAME); - } - Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ"); - chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Chooser也有权限 - activity.startActivity(chooserIntent); - launched = true; - Log.d(TAG, "使用System Chooser分享图片"); - activity.runOnUiThread(() -> Toast.makeText(activity, "尝试使用System Chooser分享图片", Toast.LENGTH_SHORT).show()); - } catch (Exception e) { - Log.e(TAG, "Chooser分享失败: " + e.getMessage()); + try { + String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; + ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage); + + if (resolvedComp != null) { + shareIntent.setComponent(resolvedComp); + } else { + shareIntent.setPackage(targetPackage); } + + activity.startActivity(shareIntent); + launched = true; + Log.d(TAG, "已发送分享图片Intent到QQ"); + activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享图片Intent到QQ", Toast.LENGTH_SHORT).show()); + } catch (Exception e) { + Log.e(TAG, "直接分享到QQ失败: " + e.getMessage()); + final String failMsg = "直接分享失败: " + e.getMessage(); + activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show()); } if (launched) { @@ -512,17 +502,21 @@ public class QQIntentShareUtil { }, 1000); } } catch (android.content.ActivityNotFoundException e) { - Log.e(TAG, "直接分享到QQ空间失败,尝试使用选择器: " + e.getMessage()); + Log.e(TAG, "直接分享到QQ空间失败,尝试降级为通用QQ分享: " + e.getMessage()); - // 如果直接分享失败,使用选择器并且限制包名 - if (packageName != null && !packageName.isEmpty()) { - shareIntent.setPackage(packageName); + // 如果直接分享失败,直接拉起应用并且限制包名 + String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; + ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage); + + if (resolvedComp != null) { + shareIntent.setComponent(resolvedComp); } else { - shareIntent.setPackage(QQ_PACKAGE_NAME); + shareIntent.setComponent(null); + shareIntent.setPackage(targetPackage); } - Intent chooserIntent = Intent.createChooser(shareIntent.setComponent(null), "分享到QQ空间"); - activity.startActivity(chooserIntent); - Toast.makeText(activity, "请从列表中选择QQ", Toast.LENGTH_SHORT).show(); + + activity.startActivity(shareIntent); + Toast.makeText(activity, "即将打开QQ,请选择分享位置", Toast.LENGTH_SHORT).show(); // 假设分享成功 if (mCallback != null) { @@ -632,39 +626,28 @@ public class QQIntentShareUtil { intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); // 鸿蒙卓易通适配 boolean launched = false; - boolean isPackageDetected = isQQInstalled(); - - if (isPackageDetected) { - try { - Intent directIntent = new Intent(intent); - // 设置组件名称 - if (isQzone) { - ComponentName comp = new ComponentName(packageName, getQZoneShareComponent()); - directIntent.setComponent(comp); - } else { - ComponentName comp = new ComponentName(packageName, getQQShareComponent()); - directIntent.setComponent(comp); - } - activity.startActivity(directIntent); - launched = true; - Log.d(TAG, "已发送多图分享Intent到QQ"); - } catch (Exception e) { - Log.e(TAG, "直接分享多图到QQ失败: " + e.getMessage()); - } - } - - if (!launched) { - if (packageName != null && !packageName.isEmpty()) { - intent.setPackage(packageName); + + try { + String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; + ComponentName resolvedComp = null; + + if (isQzone) { + resolvedComp = new ComponentName(targetPackage, getQZoneShareComponent()); } else { - intent.setPackage(QQ_PACKAGE_NAME); + resolvedComp = resolveShareComponent(activity, intent, targetPackage); } - Intent chooser = Intent.createChooser(intent, isQzone ? "分享到QQ空间" : "分享到QQ"); - chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - chooser.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - activity.startActivity(chooser); - Log.d(TAG, "使用System Chooser分享多图"); + + if (resolvedComp != null) { + intent.setComponent(resolvedComp); + } else { + intent.setPackage(targetPackage); + } + + activity.startActivity(intent); launched = true; + Log.d(TAG, "已发送多图分享Intent到QQ"); + } catch (Exception e) { + Log.e(TAG, "直接分享多图到QQ失败: " + e.getMessage()); } if (launched) {