fix(share): 优化QQ与抖音分享在鸿蒙卓易通环境下的兼容性

1. 限制 QQ 分享通过 Intent.createChooser 时的包名为 QQ 的包名,防止出现抖音等其他应用。
2. 修复 DouYinIntentShareUtil.java 之前的语法错误(缺失 catch 块)。
3. 适配鸿蒙/卓易通环境:抖音仅支持图片、视频直接通过 setPackage(...) 唤起。如果使用 com.ss.android.ugc.aweme,则指定 className 为 ShareToAwemeActivity。对于纯文本分享,使用 setPackage(...) 如果无法分享则直接打开抖音。
This commit is contained in:
2026-03-11 08:25:11 +08:00
parent 6c383a852b
commit adba5618fd
2 changed files with 105 additions and 60 deletions

View File

@@ -307,17 +307,11 @@ public class DouYinIntentShareUtil {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
if (isPackageDetected) { // 抖音在卓易通环境下实际上不支持纯文本直接唤起分享(只能发图片视频)
intent.setPackage(packageName); // 这里使用 setPackage 直接拉起,如果没有效果则会跳转抖音首页
activity.startActivity(intent); intent.setPackage(packageName);
launched = true; activity.startActivity(intent);
} else { launched = true;
// 没检测到包名更可以尝试Chooser
Intent chooser = Intent.createChooser(intent, "分享到抖音");
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(chooser);
launched = true;
}
Log.d(TAG, "成功启动文本分享"); Log.d(TAG, "成功启动文本分享");
activity.runOnUiThread(() -> Toast.makeText(activity, "成功启动文本分享", Toast.LENGTH_SHORT).show()); activity.runOnUiThread(() -> Toast.makeText(activity, "成功启动文本分享", Toast.LENGTH_SHORT).show());
} catch (Exception e) { } catch (Exception e) {
@@ -410,22 +404,25 @@ public class DouYinIntentShareUtil {
boolean launched = false; boolean launched = false;
if (isPackageDetected) { if (isPackageDetected) {
try { // 抖音仅支持图片视频直接拉起
Intent directIntent = new Intent(shareIntent); try {
directIntent.setPackage(packageName); shareIntent.setPackage(packageName);
activity.startActivity(directIntent); if ("com.ss.android.ugc.aweme".equals(packageName)) {
launched = true; shareIntent.setClassName(packageName, "com.ss.android.ugc.aweme.share.ShareToAwemeActivity");
Log.d(TAG, "已发送分享图片Intent到抖音"); }
final String successMsg = "已发送分享图片Intent到抖音"; activity.startActivity(shareIntent);
activity.runOnUiThread(() -> Toast.makeText(activity, successMsg, Toast.LENGTH_SHORT).show()); launched = true;
} catch (Exception e) { Log.d(TAG, "已发送分享图片Intent到抖音");
Log.e(TAG, "直接分享到抖音失败: " + e.getMessage()); final String successMsg = "已发送分享图片Intent到抖音";
final String failMsg = "直接分享失败: " + e.getMessage(); activity.runOnUiThread(() -> Toast.makeText(activity, successMsg, Toast.LENGTH_SHORT).show());
activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, 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 { try {
Intent cleanIntent = new Intent(Intent.ACTION_SEND); Intent cleanIntent = new Intent(Intent.ACTION_SEND);
cleanIntent.setType("image/*"); cleanIntent.setType("image/*");
@@ -522,32 +519,19 @@ public class DouYinIntentShareUtil {
// 1. 尝试直接定向分享 // 1. 尝试直接定向分享
try { try {
Intent directIntent = new Intent(intent); // 抖音分享建议只用 setPackage 直接唤起
directIntent.setPackage(packageName); intent.setPackage(packageName);
activity.startActivity(directIntent); if ("com.ss.android.ugc.aweme".equals(packageName)) {
intent.setClassName(packageName, "com.ss.android.ugc.aweme.share.ShareToAwemeActivity");
}
activity.startActivity(intent);
launched = true; launched = true;
activity.runOnUiThread(() -> Toast.makeText(activity, "多图直接分享成功", Toast.LENGTH_SHORT).show()); activity.runOnUiThread(() -> Toast.makeText(activity, "多图直接分享成功", Toast.LENGTH_SHORT).show());
} catch (Exception e) { } catch (Exception e) {
Log.d(TAG, "直接分享多图失败,转为系统分享: " + e.getMessage()); Log.d(TAG, "直接分享多图失败: " + e.getMessage());
final String msg = "直接分享多图失败: " + e.getMessage(); final String msg = "直接分享多图失败: " + e.getMessage();
activity.runOnUiThread(() -> Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show()); 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) { } catch (Exception e) {
handleShareException(activity, e); handleShareException(activity, e);
} }
@@ -633,12 +617,12 @@ public class DouYinIntentShareUtil {
if (isPackageDetected) { if (isPackageDetected) {
try { try {
Intent directIntent = new Intent(intent); String packageName = getInstalledDouYinPackage();
String packageName = getInstalledDouYinPackage(); intent.setPackage(packageName);
directIntent.setPackage(packageName); if ("com.ss.android.ugc.aweme".equals(packageName)) {
startShareActivity(activity, directIntent); intent.setClassName(packageName, "com.ss.android.ugc.aweme.share.ShareToAwemeActivity");
launched = true; }
Log.d(TAG, "已发送分享视频Intent到抖音"); activity.startActivity(intent);
activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享视频Intent到抖音", Toast.LENGTH_SHORT).show()); activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享视频Intent到抖音", Toast.LENGTH_SHORT).show());
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "直接分享视频到抖音失败: " + e.getMessage()); Log.e(TAG, "直接分享视频到抖音失败: " + e.getMessage());
@@ -747,10 +731,16 @@ public class DouYinIntentShareUtil {
// 方法1: 尝试使用系统分享直接发送到抖音 // 方法1: 尝试使用系统分享直接发送到抖音
Intent shareIntent = new Intent(Intent.ACTION_SEND); Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setPackage(packageName); // 指定只分享到抖音
shareIntent.setType("text/plain"); shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, shareContent.toString()); shareIntent.putExtra(Intent.EXTRA_TEXT, shareContent.toString());
ComponentName comp = resolveShareComponent(activity, shareIntent, packageName);
if (comp != null) {
shareIntent.setComponent(comp);
} else {
shareIntent.setPackage(packageName);
}
try { try {
activity.startActivity(shareIntent); activity.startActivity(shareIntent);
Log.d(TAG, "已发送网页分享Intent到抖音"); Log.d(TAG, "已发送网页分享Intent到抖音");
@@ -1191,9 +1181,28 @@ public class DouYinIntentShareUtil {
/** /**
* 抖音分享回调接口 * 抖音分享回调接口
*/ */
/**
* 获取抖音处理分享的具体业务组件(适配鸿蒙跳过安全拦截)
*/
private ComponentName resolveShareComponent(Activity activity, Intent intent, String packageName) {
try {
java.util.List<android.content.pm.ResolveInfo> 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 { public interface DouYinShareCallback {
void onSuccess(); void onSuccess();
void onError(int code, String message); void onError(int code, String message);
void onCancel(); void onCancel();
} }
} }

View File

@@ -234,11 +234,24 @@ public class QQIntentShareUtil {
// 如果检测到了包名,优先尝试指定包名,但不是必须的 // 如果检测到了包名,优先尝试指定包名,但不是必须的
if (isPackageDetected) { if (isPackageDetected) {
intent.setPackage(packageName); try {
activity.startActivity(intent); Intent directIntent = new Intent(intent);
launched = true; ComponentName comp = new ComponentName(packageName, getQQShareComponent());
} else { directIntent.setComponent(comp);
activity.startActivity(directIntent);
launched = true;
} catch (Exception e) {
Log.e(TAG, "直接拉起QQ文本分享失败: " + e.getMessage());
}
}
if (!launched) {
// 没有检测到包名更需要使用Chooser并提示用户选择QQ // 没有检测到包名更需要使用Chooser并提示用户选择QQ
if (packageName != null && !packageName.isEmpty()) {
intent.setPackage(packageName);
} else {
intent.setPackage(QQ_PACKAGE_NAME); // 强制限制为QQ包名防止出现抖音等其他应用
}
Intent chooser = Intent.createChooser(intent, "请选择QQ进行分享"); Intent chooser = Intent.createChooser(intent, "请选择QQ进行分享");
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(chooser); activity.startActivity(chooser);
@@ -322,6 +335,13 @@ public class QQIntentShareUtil {
intent.setType("text/plain"); intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text); 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空间"); Intent chooser = Intent.createChooser(intent, "分享到QQ空间");
activity.startActivity(chooser); activity.startActivity(chooser);
Toast.makeText(activity, "已将内容复制到剪贴板请从列表中选择QQ并粘贴分享", Toast.LENGTH_LONG).show(); Toast.makeText(activity, "已将内容复制到剪贴板请从列表中选择QQ并粘贴分享", Toast.LENGTH_LONG).show();
@@ -403,6 +423,11 @@ public class QQIntentShareUtil {
// 如果直接拉起失败或者未检测到包名使用Chooser // 如果直接拉起失败或者未检测到包名使用Chooser
if (!launched) { if (!launched) {
try { try {
if (packageName != null && !packageName.isEmpty()) {
shareIntent.setPackage(packageName);
} else {
shareIntent.setPackage(QQ_PACKAGE_NAME);
}
Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ"); Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Chooser也有权限 chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Chooser也有权限
@@ -489,7 +514,12 @@ public class QQIntentShareUtil {
} catch (android.content.ActivityNotFoundException e) { } catch (android.content.ActivityNotFoundException e) {
Log.e(TAG, "直接分享到QQ空间失败尝试使用选择器: " + e.getMessage()); 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空间"); Intent chooserIntent = Intent.createChooser(shareIntent.setComponent(null), "分享到QQ空间");
activity.startActivity(chooserIntent); activity.startActivity(chooserIntent);
Toast.makeText(activity, "请从列表中选择QQ", Toast.LENGTH_SHORT).show(); Toast.makeText(activity, "请从列表中选择QQ", Toast.LENGTH_SHORT).show();
@@ -624,6 +654,11 @@ public class QQIntentShareUtil {
} }
if (!launched) { if (!launched) {
if (packageName != null && !packageName.isEmpty()) {
intent.setPackage(packageName);
} else {
intent.setPackage(QQ_PACKAGE_NAME);
}
Intent chooser = Intent.createChooser(intent, isQzone ? "分享到QQ空间" : "分享到QQ"); Intent chooser = Intent.createChooser(intent, isQzone ? "分享到QQ空间" : "分享到QQ");
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
chooser.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); chooser.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -756,3 +791,4 @@ public class QQIntentShareUtil {
void onCancel(); void onCancel();
} }
} }