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:
@@ -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<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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user