From 821ac0bdc5110c3a6aba9a4a1ddeb3d613beae49 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 11 Mar 2026 17:34:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(share):=20=E6=81=A2=E5=A4=8DQQ=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E9=80=9A=E8=BF=87=E7=B3=BB=E7=BB=9F=E5=88=86=E4=BA=AB?= =?UTF-8?q?(Intent.createChooser)=E6=8B=89=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据需求反馈修改,因为直接拉起由于沙盒拦截等原因不生效: 1. 还原采用 Intent.createChooser(...) 拉起系统分享。 2. 依然保留 intent.setPackage(...) 限制分享列表中只包含 QQ,完美避开抖音等不相关的应用。 --- .../tsgame_niuniu/util/QQIntentShareUtil.java | 112 +++++++----------- 1 file changed, 43 insertions(+), 69 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 531b90d..fbe6e80 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 @@ -240,28 +240,25 @@ public class QQIntentShareUtil { String packageName = getInstalledQQPackage(); boolean launched = false; - // 方法1: 尝试直接拉起 + // 方法1: 采用调用系统分享 try { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, text); - + // 鸿蒙/卓易通关键适配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 (resolvedComp != null) { - intent.setComponent(resolvedComp); - } else { - intent.setPackage(targetPackage); - } - - activity.startActivity(intent); + // 通过设包名,系统分享面板中就只会出现QQ相关的组件,从而过滤掉抖音 + intent.setPackage(targetPackage); + + Intent chooser = Intent.createChooser(intent, "分享到QQ"); + chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(chooser); launched = true; - + Log.d(TAG, "成功启动分享"); activity.runOnUiThread(() -> Toast.makeText(activity, "已将内容复制到剪贴板,请在QQ中粘贴并分享", Toast.LENGTH_LONG).show()); } catch (Exception e) { @@ -333,7 +330,7 @@ public class QQIntentShareUtil { } catch (Exception e) { Log.e(TAG, "分享文本到QQ空间失败: " + e.getMessage(), e); - // 尝试使用通用分享 +// 尝试使用通用系统分享 try { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); @@ -342,15 +339,11 @@ public class QQIntentShareUtil { String packageName = getInstalledQQPackage(); 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(targetPackage); - } + intent.setPackage(targetPackage); - activity.startActivity(intent); + Intent chooser = Intent.createChooser(intent, "分享到QQ空间"); + chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(chooser); Toast.makeText(activity, "已将内容复制到剪贴板,请从打开的界面中粘贴分享", Toast.LENGTH_LONG).show(); if (mCallback != null) { @@ -407,26 +400,23 @@ public class QQIntentShareUtil { shareIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Flags也被设置在Intent上 - // 尝试直接拉起 + // 采用调用系统分享 boolean launched = false; try { String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage); + shareIntent.setPackage(targetPackage); // 限制只能分享到QQ,防止出现抖音 + + Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ"); + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Chooser也有权限 - if (resolvedComp != null) { - shareIntent.setComponent(resolvedComp); - } else { - shareIntent.setPackage(targetPackage); - } - - activity.startActivity(shareIntent); + activity.startActivity(chooserIntent); launched = true; - Log.d(TAG, "已发送分享图片Intent到QQ"); - activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享图片Intent到QQ", Toast.LENGTH_SHORT).show()); + Log.d(TAG, "已发送分享图片Intent到QQ系统面板"); } catch (Exception e) { - Log.e(TAG, "直接分享到QQ失败: " + e.getMessage()); - final String failMsg = "直接分享失败: " + e.getMessage(); + Log.e(TAG, "启动分享图片到QQ系统面板失败: " + e.getMessage()); + final String failMsg = "分享失败: " + e.getMessage(); activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show()); } @@ -502,21 +492,16 @@ public class QQIntentShareUtil { }, 1000); } } catch (android.content.ActivityNotFoundException e) { - Log.e(TAG, "直接分享到QQ空间失败,尝试降级为通用QQ分享: " + e.getMessage()); + Log.e(TAG, "直接分享到QQ空间失败,尝试系统分享: " + e.getMessage()); - // 如果直接分享失败,直接拉起应用并且限制包名 + // 采用调用系统分享 String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage); - - if (resolvedComp != null) { - shareIntent.setComponent(resolvedComp); - } else { - shareIntent.setComponent(null); - shareIntent.setPackage(targetPackage); - } - - activity.startActivity(shareIntent); - Toast.makeText(activity, "即将打开QQ,请选择分享位置", Toast.LENGTH_SHORT).show(); + shareIntent.setComponent(null); + shareIntent.setPackage(targetPackage); + + Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ空间"); + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(chooserIntent); // 假设分享成功 if (mCallback != null) { @@ -629,29 +614,18 @@ public class QQIntentShareUtil { try { String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - ComponentName resolvedComp = null; - - if (isQzone) { - resolvedComp = new ComponentName(targetPackage, getQZoneShareComponent()); - } else { - resolvedComp = resolveShareComponent(activity, intent, targetPackage); - } - - 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()); - } + // 采用调用系统分享 + intent.setPackage(targetPackage); - if (launched) { - // 延迟回调成功 + 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); + launched = true; + Log.d(TAG, "已打开系统分享面板进行多图分享"); + } catch (Exception e) { + Log.e(TAG, "开启系统多图分享到QQ失败: " + e.getMessage()); if (mCallback != null) { new Handler(Looper.getMainLooper()).postDelayed(() -> { mCallback.onSuccess();