fix(share): 优化QQ分享在系统面板中的容错拉起逻辑
1. 引入了 resolveShareComponent 动态解析指定包内真实的 ACTION_SEND 接收组件。 2. 抛弃原本硬编码的 JumpActivity 这种由于某些系统内部拉起问题可能报错导致失败的方案。 3. 如果指定 Component 和解析失败则直接兜底进入单纯的 setPackage 调用即可完成精确跳转。
This commit is contained in:
@@ -58,6 +58,24 @@ public class QQIntentShareUtil {
|
||||
private static final String QZONE_COMPONENT = "com.tencent.mobileqq.activity.QzonePublishMoodActivity";
|
||||
private static final String TIM_QZONE_COMPONENT = "com.tencent.tim.activity.QzonePublishMoodActivity";
|
||||
|
||||
/**
|
||||
* 动态获取分享组件(适配鸿蒙等定制系统)
|
||||
*/
|
||||
private ComponentName resolveShareComponent(Activity activity, Intent intent, String packageName) {
|
||||
try {
|
||||
List<android.content.pm.ResolveInfo> resolveInfoList =
|
||||
activity.getPackageManager().queryIntentActivities(intent, 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;
|
||||
}
|
||||
|
||||
private static QQIntentShareUtil instance;
|
||||
private final Context mContext;
|
||||
private QQShareCallback mCallback;
|
||||
@@ -222,7 +240,7 @@ public class QQIntentShareUtil {
|
||||
String packageName = getInstalledQQPackage();
|
||||
boolean launched = false;
|
||||
|
||||
// 方法1: 尝试使用系统Chooser,这是最兼容的方式,特别适合鸿蒙环境
|
||||
// 方法1: 尝试直接拉起
|
||||
try {
|
||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
@@ -232,31 +250,17 @@ public class QQIntentShareUtil {
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
|
||||
|
||||
// 如果检测到了包名,优先尝试指定包名,但不是必须的
|
||||
if (isPackageDetected) {
|
||||
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());
|
||||
}
|
||||
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
|
||||
ComponentName resolvedComp = resolveShareComponent(activity, intent, targetPackage);
|
||||
|
||||
if (resolvedComp != null) {
|
||||
intent.setComponent(resolvedComp);
|
||||
} else {
|
||||
intent.setPackage(targetPackage);
|
||||
}
|
||||
|
||||
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);
|
||||
activity.startActivity(intent);
|
||||
launched = true;
|
||||
}
|
||||
|
||||
Log.d(TAG, "成功启动分享");
|
||||
activity.runOnUiThread(() -> Toast.makeText(activity, "已将内容复制到剪贴板,请在QQ中粘贴并分享", Toast.LENGTH_LONG).show());
|
||||
@@ -334,17 +338,20 @@ public class QQIntentShareUtil {
|
||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(Intent.EXTRA_TEXT, text);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
String packageName = getInstalledQQPackage();
|
||||
if (packageName != null && !packageName.isEmpty()) {
|
||||
intent.setPackage(packageName);
|
||||
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
|
||||
|
||||
ComponentName resolvedComp = resolveShareComponent(activity, intent, targetPackage);
|
||||
if (resolvedComp != null) {
|
||||
intent.setComponent(resolvedComp);
|
||||
} else {
|
||||
intent.setPackage(QQ_PACKAGE_NAME);
|
||||
intent.setPackage(targetPackage);
|
||||
}
|
||||
|
||||
Intent chooser = Intent.createChooser(intent, "分享到QQ空间");
|
||||
activity.startActivity(chooser);
|
||||
Toast.makeText(activity, "已将内容复制到剪贴板,请从列表中选择QQ并粘贴分享", Toast.LENGTH_LONG).show();
|
||||
activity.startActivity(intent);
|
||||
Toast.makeText(activity, "已将内容复制到剪贴板,请从打开的界面中粘贴分享", Toast.LENGTH_LONG).show();
|
||||
|
||||
if (mCallback != null) {
|
||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||
@@ -403,13 +410,17 @@ public class QQIntentShareUtil {
|
||||
// 尝试直接拉起
|
||||
boolean launched = false;
|
||||
|
||||
if (isPackageDetected) {
|
||||
try {
|
||||
// 复制一份Intent用于尝试
|
||||
Intent directIntent = new Intent(shareIntent);
|
||||
ComponentName comp = new ComponentName(packageName, getQQShareComponent());
|
||||
directIntent.setComponent(comp);
|
||||
activity.startActivity(directIntent);
|
||||
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
|
||||
ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage);
|
||||
|
||||
if (resolvedComp != null) {
|
||||
shareIntent.setComponent(resolvedComp);
|
||||
} else {
|
||||
shareIntent.setPackage(targetPackage);
|
||||
}
|
||||
|
||||
activity.startActivity(shareIntent);
|
||||
launched = true;
|
||||
Log.d(TAG, "已发送分享图片Intent到QQ");
|
||||
activity.runOnUiThread(() -> Toast.makeText(activity, "已发送分享图片Intent到QQ", Toast.LENGTH_SHORT).show());
|
||||
@@ -418,27 +429,6 @@ public class QQIntentShareUtil {
|
||||
final String failMsg = "直接分享失败: " + e.getMessage();
|
||||
activity.runOnUiThread(() -> Toast.makeText(activity, failMsg, Toast.LENGTH_SHORT).show());
|
||||
}
|
||||
}
|
||||
|
||||
// 如果直接拉起失败,或者未检测到包名,使用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也有权限
|
||||
activity.startActivity(chooserIntent);
|
||||
launched = true;
|
||||
Log.d(TAG, "使用System Chooser分享图片");
|
||||
activity.runOnUiThread(() -> Toast.makeText(activity, "尝试使用System Chooser分享图片", Toast.LENGTH_SHORT).show());
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Chooser分享失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (launched) {
|
||||
if (mCallback != null) {
|
||||
@@ -512,17 +502,21 @@ public class QQIntentShareUtil {
|
||||
}, 1000);
|
||||
}
|
||||
} catch (android.content.ActivityNotFoundException e) {
|
||||
Log.e(TAG, "直接分享到QQ空间失败,尝试使用选择器: " + e.getMessage());
|
||||
Log.e(TAG, "直接分享到QQ空间失败,尝试降级为通用QQ分享: " + e.getMessage());
|
||||
|
||||
// 如果直接分享失败,使用选择器并且限制包名
|
||||
if (packageName != null && !packageName.isEmpty()) {
|
||||
shareIntent.setPackage(packageName);
|
||||
// 如果直接分享失败,直接拉起应用并且限制包名
|
||||
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
|
||||
ComponentName resolvedComp = resolveShareComponent(activity, shareIntent, targetPackage);
|
||||
|
||||
if (resolvedComp != null) {
|
||||
shareIntent.setComponent(resolvedComp);
|
||||
} else {
|
||||
shareIntent.setPackage(QQ_PACKAGE_NAME);
|
||||
shareIntent.setComponent(null);
|
||||
shareIntent.setPackage(targetPackage);
|
||||
}
|
||||
Intent chooserIntent = Intent.createChooser(shareIntent.setComponent(null), "分享到QQ空间");
|
||||
activity.startActivity(chooserIntent);
|
||||
Toast.makeText(activity, "请从列表中选择QQ", Toast.LENGTH_SHORT).show();
|
||||
|
||||
activity.startActivity(shareIntent);
|
||||
Toast.makeText(activity, "即将打开QQ,请选择分享位置", Toast.LENGTH_SHORT).show();
|
||||
|
||||
// 假设分享成功
|
||||
if (mCallback != null) {
|
||||
@@ -632,40 +626,29 @@ public class QQIntentShareUtil {
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); // 鸿蒙卓易通适配
|
||||
|
||||
boolean launched = false;
|
||||
boolean isPackageDetected = isQQInstalled();
|
||||
|
||||
if (isPackageDetected) {
|
||||
try {
|
||||
Intent directIntent = new Intent(intent);
|
||||
// 设置组件名称
|
||||
String targetPackage = (packageName != null && !packageName.isEmpty()) ? packageName : QQ_PACKAGE_NAME;
|
||||
ComponentName resolvedComp = null;
|
||||
|
||||
if (isQzone) {
|
||||
ComponentName comp = new ComponentName(packageName, getQZoneShareComponent());
|
||||
directIntent.setComponent(comp);
|
||||
resolvedComp = new ComponentName(targetPackage, getQZoneShareComponent());
|
||||
} else {
|
||||
ComponentName comp = new ComponentName(packageName, getQQShareComponent());
|
||||
directIntent.setComponent(comp);
|
||||
resolvedComp = resolveShareComponent(activity, intent, targetPackage);
|
||||
}
|
||||
activity.startActivity(directIntent);
|
||||
|
||||
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) {
|
||||
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);
|
||||
activity.startActivity(chooser);
|
||||
Log.d(TAG, "使用System Chooser分享多图");
|
||||
launched = true;
|
||||
}
|
||||
|
||||
if (launched) {
|
||||
// 延迟回调成功
|
||||
|
||||
Reference in New Issue
Block a user