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