feat(share): 恢复QQ分享通过系统分享(Intent.createChooser)拉起

根据需求反馈修改,因为直接拉起由于沙盒拦截等原因不生效:
1. 还原采用 Intent.createChooser(...) 拉起系统分享。
2. 依然保留 intent.setPackage(...) 限制分享列表中只包含 QQ,完美避开抖音等不相关的应用。
This commit is contained in:
2026-03-11 17:34:43 +08:00
parent 9be3406d52
commit 821ac0bdc5

View File

@@ -240,28 +240,25 @@ public class QQIntentShareUtil {
String packageName = getInstalledQQPackage(); String packageName = getInstalledQQPackage();
boolean launched = false; boolean launched = false;
// 方法1: 尝试直接拉起 // 方法1: 采用调用系统分享
try { try {
Intent intent = new Intent(Intent.ACTION_SEND); Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain"); intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text); intent.putExtra(Intent.EXTRA_TEXT, text);
// 鸿蒙/卓易通关键适配Flags // 鸿蒙/卓易通关键适配Flags
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);
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
ComponentName resolvedComp = resolveShareComponent(activity, intent, targetPackage); // 通过设包名系统分享面板中就只会出现QQ相关的组件从而过滤掉抖音
intent.setPackage(targetPackage);
if (resolvedComp != null) {
intent.setComponent(resolvedComp); Intent chooser = Intent.createChooser(intent, "分享到QQ");
} else { chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage(targetPackage); activity.startActivity(chooser);
}
activity.startActivity(intent);
launched = true; launched = true;
Log.d(TAG, "成功启动分享"); Log.d(TAG, "成功启动分享");
activity.runOnUiThread(() -> Toast.makeText(activity, "已将内容复制到剪贴板请在QQ中粘贴并分享", Toast.LENGTH_LONG).show()); activity.runOnUiThread(() -> Toast.makeText(activity, "已将内容复制到剪贴板请在QQ中粘贴并分享", Toast.LENGTH_LONG).show());
} catch (Exception e) { } catch (Exception e) {
@@ -333,7 +330,7 @@ public class QQIntentShareUtil {
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "分享文本到QQ空间失败: " + e.getMessage(), e); Log.e(TAG, "分享文本到QQ空间失败: " + e.getMessage(), e);
// 尝试使用通用分享 // 尝试使用通用系统分享
try { try {
Intent intent = new Intent(Intent.ACTION_SEND); Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain"); intent.setType("text/plain");
@@ -342,15 +339,11 @@ public class QQIntentShareUtil {
String packageName = getInstalledQQPackage(); String packageName = getInstalledQQPackage();
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
intent.setPackage(targetPackage);
ComponentName resolvedComp = resolveShareComponent(activity, intent, targetPackage);
if (resolvedComp != null) {
intent.setComponent(resolvedComp);
} else {
intent.setPackage(targetPackage);
}
activity.startActivity(intent); Intent chooser = Intent.createChooser(intent, "分享到QQ空间");
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(chooser);
Toast.makeText(activity, "已将内容复制到剪贴板,请从打开的界面中粘贴分享", Toast.LENGTH_LONG).show(); Toast.makeText(activity, "已将内容复制到剪贴板,请从打开的界面中粘贴分享", Toast.LENGTH_LONG).show();
if (mCallback != null) { if (mCallback != null) {
@@ -407,26 +400,23 @@ public class QQIntentShareUtil {
shareIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); shareIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Flags也被设置在Intent上 shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Flags也被设置在Intent上
// 尝试直接拉起 // 采用调用系统分享
boolean launched = false; boolean launched = false;
try { try {
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage); shareIntent.setPackage(targetPackage); // 限制只能分享到QQ防止出现抖音
Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 确保Chooser也有权限
if (resolvedComp != null) { activity.startActivity(chooserIntent);
shareIntent.setComponent(resolvedComp);
} else {
shareIntent.setPackage(targetPackage);
}
activity.startActivity(shareIntent);
launched = true; launched = true;
Log.d(TAG, "已发送分享图片Intent到QQ"); Log.d(TAG, "已发送分享图片Intent到QQ系统面板");
activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享图片Intent到QQ", Toast.LENGTH_SHORT).show());
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "直接分享到QQ失败: " + e.getMessage()); Log.e(TAG, "启动分享图片到QQ系统面板失败: " + e.getMessage());
final String failMsg = "直接分享失败: " + e.getMessage(); final String failMsg = "分享失败: " + e.getMessage();
activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show()); activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show());
} }
@@ -502,21 +492,16 @@ public class QQIntentShareUtil {
}, 1000); }, 1000);
} }
} catch (android.content.ActivityNotFoundException e) { } catch (android.content.ActivityNotFoundException e) {
Log.e(TAG, "直接分享到QQ空间失败尝试降级为通用QQ分享: " + e.getMessage()); Log.e(TAG, "直接分享到QQ空间失败尝试系统分享: " + e.getMessage());
// 如果直接分享失败,直接拉起应用并且限制包名 // 采用调用系统分享
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage); shareIntent.setComponent(null);
shareIntent.setPackage(targetPackage);
if (resolvedComp != null) {
shareIntent.setComponent(resolvedComp); Intent chooserIntent = Intent.createChooser(shareIntent, "分享到QQ空间");
} else { chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.setComponent(null); activity.startActivity(chooserIntent);
shareIntent.setPackage(targetPackage);
}
activity.startActivity(shareIntent);
Toast.makeText(activity, "即将打开QQ请选择分享位置", Toast.LENGTH_SHORT).show();
// 假设分享成功 // 假设分享成功
if (mCallback != null) { if (mCallback != null) {
@@ -629,29 +614,18 @@ public class QQIntentShareUtil {
try { try {
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME; String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
ComponentName resolvedComp = null; // 采用调用系统分享
intent.setPackage(targetPackage);
if (isQzone) {
resolvedComp = new ComponentName(targetPackage, getQZoneShareComponent());
} else {
resolvedComp = resolveShareComponent(activity, intent, targetPackage);
}
if (resolvedComp != null) {
intent.setComponent(resolvedComp);
} else {
intent.setPackage(targetPackage);
}
activity.startActivity(intent);
launched = true;
Log.d(TAG, "已发送多图分享Intent到QQ");
} catch (Exception e) {
Log.e(TAG, "直接分享多图到QQ失败: " + e.getMessage());
}
if (launched) { Intent chooser = Intent.createChooser(intent, isQzone ? "分享到QQ空间" : "分享到QQ");
// 延迟回调成功 chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
chooser.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivity(chooser);
launched = true;
Log.d(TAG, "已打开系统分享面板进行多图分享");
} catch (Exception e) {
Log.e(TAG, "开启系统多图分享到QQ失败: " + e.getMessage());
if (mCallback != null) { if (mCallback != null) {
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
mCallback.onSuccess(); mCallback.onSuccess();