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_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,10 +731,16 @@ 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);
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 {
void onSuccess();
void onError(int code, String message);
void onCancel();
}
}

View File

@@ -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);
@@ -322,6 +335,13 @@ public class QQIntentShareUtil {
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);
Toast.makeText(activity, "已将内容复制到剪贴板请从列表中选择QQ并粘贴分享", Toast.LENGTH_LONG).show();
@@ -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();
}
}