From adba5618fd3753e63aa7854d9a9ee90dfc78c0f0 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 11 Mar 2026 08:25:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(share):=20=E4=BC=98=E5=8C=96QQ=E4=B8=8E?= =?UTF-8?q?=E6=8A=96=E9=9F=B3=E5=88=86=E4=BA=AB=E5=9C=A8=E9=B8=BF=E8=92=99?= =?UTF-8?q?=E5=8D=93=E6=98=93=E9=80=9A=E7=8E=AF=E5=A2=83=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 限制 QQ 分享通过 Intent.createChooser 时的包名为 QQ 的包名,防止出现抖音等其他应用。 2. 修复 DouYinIntentShareUtil.java 之前的语法错误(缺失 catch 块)。 3. 适配鸿蒙/卓易通环境:抖音仅支持图片、视频直接通过 setPackage(...) 唤起。如果使用 com.ss.android.ugc.aweme,则指定 className 为 ShareToAwemeActivity。对于纯文本分享,使用 setPackage(...) 如果无法分享则直接打开抖音。 --- .../util/DouYinIntentShareUtil.java | 119 ++++++++++-------- .../tsgame_niuniu/util/QQIntentShareUtil.java | 46 ++++++- 2 files changed, 105 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java b/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java index 91ab791..b7002c3 100644 --- a/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java +++ b/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java @@ -302,22 +302,16 @@ public class DouYinIntentShareUtil { 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); - - if (isPackageDetected) { - intent.setPackage(packageName); - activity.startActivity(intent); - launched = true; - } else { - // 没检测到包名,更可以尝试Chooser - Intent chooser = Intent.createChooser(intent, "分享到抖音"); - chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(chooser); - launched = true; - } + + // 抖音在卓易通环境下实际上不支持纯文本直接唤起分享(只能发图片视频) + // 这里使用 setPackage 直接拉起,如果没有效果则会跳转抖音首页 + intent.setPackage(packageName); + activity.startActivity(intent); + launched = true; Log.d(TAG, "成功启动文本分享"); activity.runOnUiThread(() -> Toast.makeText(activity, "成功启动文本分享", Toast.LENGTH_SHORT).show()); } catch (Exception e) { @@ -410,22 +404,25 @@ public class DouYinIntentShareUtil { boolean launched = false; if (isPackageDetected) { - try { - Intent directIntent = new Intent(shareIntent); - directIntent.setPackage(packageName); - activity.startActivity(directIntent); - launched = true; - Log.d(TAG, "已发送分享图片Intent到抖音"); - final String successMsg = "已发送分享图片Intent到抖音"; - activity.runOnUiThread(() -> Toast.makeText(activity, successMsg, Toast.LENGTH_SHORT).show()); - } catch (Exception e) { - Log.e(TAG, "直接分享到抖音失败: " + e.getMessage()); - final String failMsg = "直接分享失败: " + e.getMessage(); - activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show()); - } - } + // 抖音仅支持图片视频直接拉起 + try { + shareIntent.setPackage(packageName); + if ("com.ss.android.ugc.aweme".equals(packageName)) { + shareIntent.setClassName(packageName, "com.ss.android.ugc.aweme.share.ShareToAwemeActivity"); + } + activity.startActivity(shareIntent); + launched = true; + Log.d(TAG, "已发送分享图片Intent到抖音"); + final String successMsg = "已发送分享图片Intent到抖音"; + activity.runOnUiThread(() -> Toast.makeText(activity, successMsg, Toast.LENGTH_SHORT).show()); + } catch (Exception e) { + Log.e(TAG, "直接分享到抖音失败: " + e.getMessage()); + final String failMsg = "直接分享失败: " + e.getMessage(); + activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show()); + } + } - if (!launched) { + if (!launched) { try { Intent cleanIntent = new Intent(Intent.ACTION_SEND); cleanIntent.setType("image/*"); @@ -522,32 +519,19 @@ public class DouYinIntentShareUtil { // 1. 尝试直接定向分享 try { - Intent directIntent = new Intent(intent); - directIntent.setPackage(packageName); - activity.startActivity(directIntent); + // 抖音分享建议只用 setPackage 直接唤起 + intent.setPackage(packageName); + if ("com.ss.android.ugc.aweme".equals(packageName)) { + intent.setClassName(packageName, "com.ss.android.ugc.aweme.share.ShareToAwemeActivity"); + } + activity.startActivity(intent); launched = true; activity.runOnUiThread(() -> Toast.makeText(activity, "多图直接分享成功", Toast.LENGTH_SHORT).show()); } catch (Exception e) { - Log.d(TAG, "直接分享多图失败,转为系统分享: " + e.getMessage()); + Log.d(TAG, "直接分享多图失败: " + e.getMessage()); final String msg = "直接分享多图失败: " + e.getMessage(); activity.runOnUiThread(() -> Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show()); } - - // 2. 失败则使用Chooser (无包名限制) - if (!launched) { - try { - startShareActivity(activity, intent); - activity.runOnUiThread(() -> Toast.makeText(activity, "尝试System Share多图", Toast.LENGTH_SHORT).show()); - } catch (Exception e) { - Log.e(TAG, "多图System Share失败: " + e.getMessage()); - final String msg2 = "多图System Share失败: " + e.getMessage(); - activity.runOnUiThread(() -> Toast.makeText(activity, msg2, Toast.LENGTH_SHORT).show()); - - Intent chooser = Intent.createChooser(intent, "分享到抖音"); - chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(chooser); - } - } } catch (Exception e) { handleShareException(activity, e); } @@ -633,12 +617,12 @@ public class DouYinIntentShareUtil { if (isPackageDetected) { try { - Intent directIntent = new Intent(intent); - String packageName = getInstalledDouYinPackage(); - directIntent.setPackage(packageName); - startShareActivity(activity, directIntent); - launched = true; - Log.d(TAG, "已发送分享视频Intent到抖音"); + String packageName = getInstalledDouYinPackage(); + intent.setPackage(packageName); + if ("com.ss.android.ugc.aweme".equals(packageName)) { + intent.setClassName(packageName, "com.ss.android.ugc.aweme.share.ShareToAwemeActivity"); + } + activity.startActivity(intent); activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享视频Intent到抖音", Toast.LENGTH_SHORT).show()); } catch (Exception e) { Log.e(TAG, "直接分享视频到抖音失败: " + e.getMessage()); @@ -747,9 +731,15 @@ public class DouYinIntentShareUtil { // 方法1: 尝试使用系统分享直接发送到抖音 Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setPackage(packageName); // 指定只分享到抖音 shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_TEXT, shareContent.toString()); + + ComponentName comp = resolveShareComponent(activity, shareIntent, packageName); + if (comp != null) { + shareIntent.setComponent(comp); + } else { + shareIntent.setPackage(packageName); + } try { activity.startActivity(shareIntent); @@ -1191,9 +1181,28 @@ public class DouYinIntentShareUtil { /** * 抖音分享回调接口 */ + /** + * 获取抖音处理分享的具体业务组件(适配鸿蒙跳过安全拦截) + */ + private ComponentName resolveShareComponent(Activity activity, Intent intent, String packageName) { + try { + java.util.List resolveInfoList = + activity.getPackageManager().queryIntentActivities(intent, android.content.pm.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; + } + public interface DouYinShareCallback { void onSuccess(); void onError(int code, String message); void onCancel(); } } + 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 5377f95..f1aa286 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 @@ -234,11 +234,24 @@ public class QQIntentShareUtil { // 如果检测到了包名,优先尝试指定包名,但不是必须的 if (isPackageDetected) { - intent.setPackage(packageName); - activity.startActivity(intent); - launched = true; - } else { + 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 (!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); @@ -321,6 +334,13 @@ public class QQIntentShareUtil { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, text); + + String packageName = getInstalledQQPackage(); + if (packageName != null && !packageName.isEmpty()) { + intent.setPackage(packageName); + } else { + intent.setPackage(QQ_PACKAGE_NAME); + } Intent chooser = Intent.createChooser(intent, "分享到QQ空间"); activity.startActivity(chooser); @@ -403,6 +423,11 @@ public class QQIntentShareUtil { // 如果直接拉起失败,或者未检测到包名,使用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也有权限 @@ -489,7 +514,12 @@ public class QQIntentShareUtil { } catch (android.content.ActivityNotFoundException e) { Log.e(TAG, "直接分享到QQ空间失败,尝试使用选择器: " + e.getMessage()); - // 如果直接分享失败,使用选择器 + // 如果直接分享失败,使用选择器并且限制包名 + if (packageName != null && !packageName.isEmpty()) { + shareIntent.setPackage(packageName); + } else { + shareIntent.setPackage(QQ_PACKAGE_NAME); + } Intent chooserIntent = Intent.createChooser(shareIntent.setComponent(null), "分享到QQ空间"); activity.startActivity(chooserIntent); Toast.makeText(activity, "请从列表中选择QQ", Toast.LENGTH_SHORT).show(); @@ -624,6 +654,11 @@ public class QQIntentShareUtil { } if (!launched) { + if (packageName != null && !packageName.isEmpty()) { + intent.setPackage(packageName); + } else { + intent.setPackage(QQ_PACKAGE_NAME); + } Intent chooser = Intent.createChooser(intent, isQzone ? "分享到QQ空间" : "分享到QQ"); chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); chooser.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); @@ -756,3 +791,4 @@ public class QQIntentShareUtil { void onCancel(); } } +