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 fbe6e80..4a77f30 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 @@ -250,16 +250,13 @@ public class QQIntentShareUtil { 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; - // 通过设包名,系统分享面板中就只会出现QQ相关的组件,从而过滤掉抖音 - intent.setPackage(targetPackage); - - Intent chooser = Intent.createChooser(intent, "分享到QQ"); + // 在卓易通系统上,提前设置 package 会导致 createChooser 失效,因此改用排除法 + Intent chooser = createTargetedChooserIntent(activity, intent, "分享到QQ"); chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(chooser); launched = true; - Log.d(TAG, "成功启动分享"); + Log.d(TAG, "成功启动系统分享面板"); activity.runOnUiThread(() -> Toast.makeText(activity, "已将内容复制到剪贴板,请在QQ中粘贴并分享", Toast.LENGTH_LONG).show()); } catch (Exception e) { Log.e(TAG, "启动分享失败: " + e.getMessage()); @@ -337,11 +334,8 @@ public class QQIntentShareUtil { intent.putExtra(Intent.EXTRA_TEXT, text); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - String packageName = getInstalledQQPackage(); - String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - intent.setPackage(targetPackage); - - Intent chooser = Intent.createChooser(intent, "分享到QQ空间"); + // 在卓易通系统上,提前设置 package 会导致 createChooser 失效,因此改用排除法 + Intent chooser = createTargetedChooserIntent(activity, intent, "分享到QQ空间"); chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(chooser); Toast.makeText(activity, "已将内容复制到剪贴板,请从打开的界面中粘贴分享", Toast.LENGTH_LONG).show(); @@ -404,10 +398,8 @@ public class QQIntentShareUtil { boolean launched = false; try { - String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - shareIntent.setPackage(targetPackage); // 限制只能分享到QQ,防止出现抖音 - - Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ"); + // 在卓易通系统上,提前设置 package 会导致 createChooser 失效,因此改用排除法 + Intent chooserIntent = createTargetedChooserIntent(activity, shareIntent, "分享到QQ"); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Chooser也有权限 @@ -494,12 +486,8 @@ public class QQIntentShareUtil { } catch (android.content.ActivityNotFoundException e) { Log.e(TAG, "直接分享到QQ空间失败,尝试系统分享: " + e.getMessage()); - // 采用调用系统分享 - String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - shareIntent.setComponent(null); - shareIntent.setPackage(targetPackage); - - Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ空间"); + // 采用调用系统分享,并排除其他组件以过滤出QQ + Intent chooserIntent = createTargetedChooserIntent(activity, shareIntent, "分享到QQ空间"); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(chooserIntent); @@ -613,14 +601,11 @@ public class QQIntentShareUtil { boolean launched = false; try { - String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; - // 采用调用系统分享 - intent.setPackage(targetPackage); - - Intent chooser = Intent.createChooser(intent, isQzone ? "分享到QQ空间" : "分享到QQ"); + // 采用调用系统分享,通过排除法避免设 package 导致的 chooser 失效 + Intent chooser = createTargetedChooserIntent(activity, 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, "已打开系统分享面板进行多图分享"); @@ -726,6 +711,45 @@ public class QQIntentShareUtil { } } + /** + * 构建排除特定组件(如抖音)的系统分享选择器 + * 在卓易通等环境下,给 intent setPackage 会导致 createChooser 直接失效不弹窗, + * 所以我们通过原生的 intent 送入 createChooser,然后利用 EXTRA_EXCLUDE_COMPONENTS 排除抖音。 + */ + private Intent createTargetedChooserIntent(Activity activity, Intent targetIntent, CharSequence title) { + // 重要:确保本体 intent 不要携带 package 限制,否则在卓易通系统的 chooser 会失效静默 + targetIntent.setPackage(null); + targetIntent.setComponent(null); + + Intent chooser = Intent.createChooser(targetIntent, title); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + try { + // 找出抖音可能接收分享的所有组件 + Intent queryIntent = new Intent(targetIntent.getAction()); + queryIntent.setType(targetIntent.getType()); + queryIntent.setPackage("com.ss.android.ugc.aweme"); + List resInfo = activity.getPackageManager().queryIntentActivities(queryIntent, 0); + + List excludedComponents = new ArrayList<>(); + if (resInfo != null && !resInfo.isEmpty()) { + for (android.content.pm.ResolveInfo info : resInfo) { + excludedComponents.add(new ComponentName(info.activityInfo.packageName, info.activityInfo.name)); + } + } else { + // 兜底硬编码过滤最常见的涉事抖音组件 + excludedComponents.add(new ComponentName("com.ss.android.ugc.aweme", "com.ss.android.ugc.aweme.share.ShareToAwemeActivity")); + } + + chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponents.toArray(new ComponentName[0])); + } catch (Exception e) { + Log.e(TAG, "设置排他组件失败", e); + } + } + + return chooser; + } + /** * QQ分享回调接口 */