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(); } } +