From a7b7f38d31698c3e8eef3a1292d16de33db41ddf Mon Sep 17 00:00:00 2001 From: Joywayer Date: Sun, 15 Mar 2026 19:43:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=B8=BF=E8=92=99=E6=8A=96?= =?UTF-8?q?=E9=9F=B3qq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- app/release/output-metadata.json | 2 +- .../DouYinIntentShareHelper.java | 259 ++------- .../util/DouYinIntentShareUtil.java | 508 +++++++----------- .../tsgame_niuniu/util/QQIntentShareUtil.java | 69 ++- keystore/daoqi_game_1.txt | 30 ++ keystore/daoqi_game_2.keystore | Bin 0 -> 2588 bytes keystore/daoqi_game_2.txt | 30 ++ keystore/daoqi_game_3.keystore | Bin 0 -> 2588 bytes keystore/daoqi_game_3.txt | 30 ++ keystore/gamehall.txt | 41 ++ 11 files changed, 406 insertions(+), 565 deletions(-) create mode 100644 keystore/daoqi_game_1.txt create mode 100644 keystore/daoqi_game_2.keystore create mode 100644 keystore/daoqi_game_2.txt create mode 100644 keystore/daoqi_game_3.keystore create mode 100644 keystore/daoqi_game_3.txt create mode 100644 keystore/gamehall.txt diff --git a/app/build.gradle b/app/build.gradle index 51d9a9e..e4045ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,7 @@ android { buildToolsVersion '33.0.0' defaultConfig { - applicationId "com.jx.jyhd" + applicationId "com.daoqi.lobby" minSdkVersion 21 targetSdkVersion 32 versionCode= 3 diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index cda7cd8..89361f1 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -4,7 +4,7 @@ "type": "APK", "kind": "Directory" }, - "applicationId": "com.jx.jyhd", + "applicationId": "com.dq.jy", "variantName": "processReleaseResources", "elements": [ { diff --git a/app/src/main/java/com/tagmae/tsgame_erwang/DouYinIntentShareHelper.java b/app/src/main/java/com/tagmae/tsgame_erwang/DouYinIntentShareHelper.java index 4a35af1..3a3e0dc 100644 --- a/app/src/main/java/com/tagmae/tsgame_erwang/DouYinIntentShareHelper.java +++ b/app/src/main/java/com/tagmae/tsgame_erwang/DouYinIntentShareHelper.java @@ -51,9 +51,9 @@ public class DouYinIntentShareHelper { douYinIntentShareUtil.setShareCallback(new DouYinIntentShareUtil.DouYinShareCallback() { @Override public void onSuccess() { - ((Activity) context).runOnUiThread(() -> - Toast.makeText(context, "抖音分享成功", Toast.LENGTH_SHORT).show() - ); + // ((Activity) context).runOnUiThread(() -> + // Toast.makeText(context, "抖音分享成功", Toast.LENGTH_SHORT).show() + // ); } @Override @@ -201,8 +201,9 @@ public class DouYinIntentShareHelper { // 如果处理失败,退回到纯文本分享 //douYinIntentShareUtil.shareToPrivateMessage((Activity) context, textContent, null, null); } else { - // 只分享文本 - 直接使用Intent分享而不是复制粘贴方式 - shareWebPageDirectToDouYin((Activity) context, bean.getTitle(), bean.getDescription(), ""); + // 只分享文本 - 使用之前统一的弹窗引导方式 + DouYinIntentShareUtil util = DouYinIntentShareUtil.getInstance(context); + util.shareWebpageToDouyin((Activity) context, "", bean.getTitle(), bean.getDescription()); } } @@ -336,9 +337,9 @@ public class DouYinIntentShareHelper { douYinIntentShareUtil.setShareCallback(new DouYinIntentShareUtil.DouYinShareCallback() { @Override public void onSuccess() { - ((Activity) context).runOnUiThread(() -> - Toast.makeText(context, "抖音分享成功", Toast.LENGTH_SHORT).show() - ); + // ((Activity) context).runOnUiThread(() -> + // Toast.makeText(context, "抖音分享成功", Toast.LENGTH_SHORT).show() + // ); } @Override @@ -357,8 +358,8 @@ public class DouYinIntentShareHelper { }); // 显示分享提示 - Toast.makeText(context, "正在分享到抖音", Toast.LENGTH_SHORT).show(); // 修改:直接调用Intent分享方法,而不是复制粘贴方式 - shareTextDirectToDouYin((Activity) context, text); + Toast.makeText(context, "正在分享到抖音", Toast.LENGTH_SHORT).show(); // 修改:使用统一的引导弹窗方式 + douYinIntentShareUtil.shareTextToDouyin((Activity) context, text); } catch (Exception e) { e.printStackTrace(); @@ -417,11 +418,11 @@ public class DouYinIntentShareHelper { content.append(title).append("\n\n"); } if (!TextUtils.isEmpty(description)) { - content.append(description).append("\n\n"); + content.append(description); } - if (!TextUtils.isEmpty(webUrl)) { - content.append(webUrl); - } String textContent = content.toString(); + // 用户要求不要链接的内容 + + String textContent = content.toString().trim(); try { Context mContext = activity.getApplicationContext(); // 设置缩略图 - 使用应用的启动图标 logo6 而不是 ic_launcher @@ -429,17 +430,19 @@ public class DouYinIntentShareHelper { mContext.getResources().getIdentifier("logo6", "drawable", mContext.getPackageName())); Uri imagePath = Base64ImageUtil.saveBitmapToFile(activity, thumbBmp, null); - // 方式1:尝试分享图文到私信(图片+文本) + // 方式1:尝试分享图文 if (imagePath != null) { - shareImageWithTextDirectToDouYin(activity, textContent, imagePath); + DouYinIntentShareUtil util = DouYinIntentShareUtil.getInstance(activity); + util.shareToPrivateMessage(activity, textContent, imagePath, "image"); return; } } catch (Exception e) { e.printStackTrace(); } - // 方式2:如果图片处理失败,使用纯文本直接分享 - shareTextDirectToDouYin(activity, textContent); + // 方式2:如果图片处理失败,使用弹窗引导分享文本 + DouYinIntentShareUtil util = DouYinIntentShareUtil.getInstance(activity); + util.shareWebpageToDouyin(activity, webUrl, title, description); } catch (Exception e) { e.printStackTrace(); Toast.makeText(activity, "网页分享出错: " + e.getMessage(), Toast.LENGTH_SHORT).show(); @@ -497,13 +500,11 @@ public class DouYinIntentShareHelper { content.append(title).append("\n\n"); } if (!TextUtils.isEmpty(description)) { - content.append(description).append("\n\n"); - } - if (!TextUtils.isEmpty(webUrl)) { - content.append(webUrl); + content.append(description); } + // 用户要求不要链接的内容 - String textContent = content.toString(); + String textContent = content.toString().trim(); // 如果提供了预览图,先处理图片再分享 if (!TextUtils.isEmpty(previewImageBase64)) { @@ -855,216 +856,24 @@ public class DouYinIntentShareHelper { } /** - * 直接分享网页到抖音(使用Intent方式,不是复制粘贴) - * - * @param activity 当前活动 - * @param title 网页标题 - * @param description 网页描述 - * @param webUrl 网页URL + * 第一种方法:直接分享网页到抖音(废弃,接入工具类) */ public static void shareWebPageDirectToDouYin(Activity activity, String title, String description, String webUrl) { - try { - // 检查抖音是否已安装 - HarmonyOS兼容性修改:移除强制检查 - // if (!isAppInstalled(activity, "com.ss.android.ugc.aweme")) { - // Toast.makeText(activity, "抖音未安装,无法分享", Toast.LENGTH_SHORT).show(); - // return; - // } - - // 构建要分享的文本内容 - StringBuilder content = new StringBuilder(); - if (!TextUtils.isEmpty(title)) { - content.append(title).append("\n\n"); - } - if (!TextUtils.isEmpty(description)) { - content.append(description).append("\n\n"); - } if (!TextUtils.isEmpty(webUrl)) { - content.append(webUrl); - } - - String textContent = content.toString(); - - // 方法1:先尝试直接启动抖音App - if (tryLaunchDouyinDirectly(activity, textContent)) { - return; - } - - // 方法2:尝试使用多种MIME类型的分享Intent - if (tryMultipleShareIntents(activity, textContent)) { - return; - } - - // 方法3:最后的备选方案 - 复制到剪贴板并引导用户 - fallbackCopyAndLaunch(activity, textContent); - - } catch (Exception e) { - e.printStackTrace(); - Toast.makeText(activity, "网页分享出错: " + e.getMessage(), Toast.LENGTH_SHORT).show(); - } + DouYinIntentShareUtil util = DouYinIntentShareUtil.getInstance(activity); + util.shareWebpageToDouyin(activity, webUrl, title, description); } /** - * 直接分享图片和文本到抖音(使用Intent方式) + * 直接分享图片和文本到抖音 */ private static void shareImageWithTextDirectToDouYin(Activity activity, String text, Uri imageUri) { - try { - // 图片分享通常有更好的支持,先尝试图片分享 - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("image/*"); - shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); - shareIntent.putExtra(Intent.EXTRA_TEXT, text); - shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - - // 检查抖音是否可以处理图片分享 - if (isIntentSafe(activity, shareIntent, "com.ss.android.ugc.aweme")) { - shareIntent.setPackage("com.ss.android.ugc.aweme"); - // 添加额外参数尝试指定分享类型为私信 - shareIntent.putExtra("share_type", "private_message"); - shareIntent.putExtra("type", "private"); - - activity.startActivity(shareIntent); - Toast.makeText(activity, "正在打开抖音图文分享...", Toast.LENGTH_SHORT).show(); - return; - } - - // 如果直接分享失败,使用系统选择器 - Intent chooser = Intent.createChooser(shareIntent.setPackage(null), "分享图文"); - activity.startActivity(chooser); - - new android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(() -> { - Toast.makeText(activity, "请选择抖音进行分享", Toast.LENGTH_LONG).show(); - }, 1000); - - } catch (Exception e) { - e.printStackTrace(); - // 如果图片分享失败,降级为纯文本分享 - Toast.makeText(activity, "图片分享失败,尝试文本分享", Toast.LENGTH_SHORT).show(); - shareTextDirectToDouYin(activity, text); - } + // 直接接入使用工具类分享图文的方法 + DouYinIntentShareUtil util = DouYinIntentShareUtil.getInstance(activity); + util.shareToPrivateMessage(activity, text, imageUri, "image"); }/** - * 直接分享纯文本到抖音(使用Intent方式) + * 直接分享纯文本到抖音(废弃,接入工具类) */ private static void shareTextDirectToDouYin(Activity activity, String text) { - try { - // 方法1:先尝试直接启动抖音App - if (tryLaunchDouyinDirectly(activity, text)) { - return; - } - - // 方法2:尝试使用多种MIME类型的分享Intent - if (tryMultipleShareIntents(activity, text)) { - return; - } - - // 方法3:最后的备选方案 - 复制到剪贴板并引导用户 - fallbackCopyAndLaunch(activity, text); - - } catch (Exception e) { - e.printStackTrace(); - Toast.makeText(activity, "文本分享失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); - } - } - - /** - * 方法1:尝试直接启动抖音App并复制内容到剪贴板 - */ - private static boolean tryLaunchDouyinDirectly(Activity activity, String content) { - try { - // 复制内容到剪贴板 - copyTextToClipboard(activity, content); - - // 尝试直接启动抖音主页 - Intent launchIntent = activity.getPackageManager().getLaunchIntentForPackage("com.ss.android.ugc.aweme"); - if (launchIntent != null) { - launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(launchIntent); - - // 提示用户操作 - Toast.makeText(activity, "内容已复制到剪贴板,请在抖音中点击\"消息\"→选择联系人→粘贴发送", Toast.LENGTH_LONG).show(); - return true; - } - } catch (Exception e) { - Log.e("DouYinShare", "直接启动抖音失败: " + e.getMessage()); - } - return false; - } - - /** - * 方法2:尝试使用多种MIME类型创建分享Intent - */ - private static boolean tryMultipleShareIntents(Activity activity, String content) { - // 尝试的MIME类型列表 - String[] mimeTypes = { - "text/plain", - "*/*", - "application/octet-stream" - }; - - for (String mimeType : mimeTypes) { - try { - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType(mimeType); - shareIntent.putExtra(Intent.EXTRA_TEXT, content); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, "网页分享"); - - // 检查是否有抖音可以处理这种Intent - if (isIntentSafe(activity, shareIntent, "com.ss.android.ugc.aweme")) { - shareIntent.setPackage("com.ss.android.ugc.aweme"); - activity.startActivity(shareIntent); - Toast.makeText(activity, "正在打开抖音分享...", Toast.LENGTH_SHORT).show(); - return true; - } - } catch (Exception e) { - Log.e("DouYinShare", "MIME类型 " + mimeType + " 分享失败: " + e.getMessage()); - } - } - - // 如果直接分享失败,尝试使用系统分享选择器 - try { - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("text/plain"); - shareIntent.putExtra(Intent.EXTRA_TEXT, content); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, "网页分享"); - - Intent chooser = Intent.createChooser(shareIntent, "选择分享方式"); - activity.startActivity(chooser); - - // 提示用户如果看不到抖音选项的解决方案 - new android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(() -> { - Toast.makeText(activity, "如果没有抖音选项,请选择\"复制\"然后手动打开抖音粘贴", Toast.LENGTH_LONG).show(); - }, 1000); - return true; - - } catch (Exception e) { - Log.e("DouYinShare", "系统分享选择器失败: " + e.getMessage()); - } - - return false; - } - - /** - * 方法3:备选方案 - 复制到剪贴板并引导用户手动操作 - */ - private static void fallbackCopyAndLaunch(Activity activity, String content) { - try { - // 复制到剪贴板 - copyTextToClipboard(activity, content); - - // 尝试启动抖音 - try { - Intent launchIntent = activity.getPackageManager().getLaunchIntentForPackage("com.ss.android.ugc.aweme"); - if (launchIntent != null) { - launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(launchIntent); - } - } catch (Exception e) { - Log.e("DouYinShare", "启动抖音失败: " + e.getMessage()); - } - - // 详细的操作指导 - Toast.makeText(activity, "内容已复制!请在抖音中:消息→选择好友→长按输入框→粘贴→发送", Toast.LENGTH_LONG).show(); - - } catch (Exception e) { - e.printStackTrace(); - Toast.makeText(activity, "分享失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); - } + DouYinIntentShareUtil util = DouYinIntentShareUtil.getInstance(activity); + util.shareTextToDouyin(activity, text); } /** diff --git a/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java b/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java index b7002c3..ddf96aa 100644 --- a/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java +++ b/app/src/main/java/com/tsgame/tsgame_niuniu/util/DouYinIntentShareUtil.java @@ -162,119 +162,43 @@ public class DouYinIntentShareUtil { * @return 是否成功启动 */ private boolean tryLaunchDouyin(Activity activity) { + String packageName = "com.ss.android.ugc.aweme"; + try { - String packageName = getInstalledDouYinPackage(); - Log.d(TAG, "尝试启动抖音,包名: " + packageName); - - // 方法0:最稳妥的Intent Chooser方式(适配鸿蒙卓易通) + Intent launchIntent = null; + + // 方法1: 尝试获取官方启动Intent try { - // 如果是单纯想打开抖音,我们可以构造一个简单的VIEW Intent或者MAIN Intent - // 但如果是为了分享,建议直接调用shareToPrivateMessage等方法 - // 这里仅作为启动应用的逻辑 - Intent intent = activity.getPackageManager().getLaunchIntentForPackage(packageName); - if (intent == null) { - // 如果获取不到LaunchIntent,构建通用启动Intent - intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_LAUNCHER); - intent.setPackage(packageName); - } - - if (intent != null) { - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); // 卓易通关键flag - activity.startActivity(intent); - return true; - } + launchIntent = activity.getPackageManager().getLaunchIntentForPackage(packageName); } catch (Exception e) { - Log.e(TAG, "启动抖音失败: " + e.getMessage()); - final String msg = "启动抖音失败: " + e.getMessage(); - activity.runOnUiThread(() -> Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show()); + // 忽略异常 } - // 方法1:使用标准启动方式 (旧逻辑保留) - Intent launchIntent = activity.getPackageManager().getLaunchIntentForPackage(packageName); - if (launchIntent != null) { - launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - activity.startActivity(launchIntent); - Log.d(TAG, "成功使用标准方式启动抖音"); - activity.runOnUiThread(() -> Toast.makeText(activity, "标准方式启动成功", Toast.LENGTH_SHORT).show()); - return true; + // 方法2: 如果获取不到,尝试构造Intent盲拉 + if (launchIntent == null) { + launchIntent = new Intent(Intent.ACTION_MAIN); + launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); + launchIntent.setPackage(packageName); } - - // 方法2:使用ACTION_MAIN + CATEGORY_LAUNCHER - try { - Intent mainIntent = new Intent(Intent.ACTION_MAIN); - mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); - mainIntent.setPackage(packageName); - - List resolveInfoList = - activity.getPackageManager().queryIntentActivities(mainIntent, 0); - if (resolveInfoList != null && !resolveInfoList.isEmpty()) { - android.content.pm.ResolveInfo resolveInfo = resolveInfoList.get(0); - String className = resolveInfo.activityInfo.name; - - Intent componentIntent = new Intent(Intent.ACTION_MAIN); - componentIntent.addCategory(Intent.CATEGORY_LAUNCHER); - componentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - componentIntent.setComponent(new ComponentName(packageName, className)); - - activity.startActivity(componentIntent); - Log.d(TAG, "成功使用组件方式启动抖音"); - return true; - } - } catch (Exception e) { - Log.e(TAG, "方法2失败: " + e.getMessage()); - } - - // 尝试所有可能的抖音URI schemes - String[] schemes = { - "snssdk1128://", // 原有scheme - "aweme://", // 原有scheme - "douyin://", // 新增scheme - "douyinlite://", // 抖音极速版scheme - "snssdk1128://feed", // 带路径的scheme - "aweme://feed", // 带路径的scheme - "douyin://feed", // 带路径的scheme - "snssdk1128://home/trending", // 热门页 - "douyin://home/trending", // 热门页 - "snssdk1128://post", // 发布页 - "douyin://post" // 发布页 - }; - - for (String scheme : schemes) { - try { - Intent schemeIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(scheme)); - schemeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - // 如果设置包名,可以确保只打开抖音应用 - schemeIntent.setPackage(packageName); - activity.startActivity(schemeIntent); - Log.d(TAG, "成功使用scheme方式启动抖音: " + scheme); - return true; - } catch (Exception e) { - Log.e(TAG, "scheme方式失败 " + scheme + ": " + e.getMessage()); - // 继续尝试下一个scheme - } - } - - // 方法4:尝试使用系统VIEW处理 - try { - Intent viewIntent = new Intent(Intent.ACTION_VIEW); - viewIntent.setData(Uri.parse("https://www.douyin.com")); - viewIntent.setPackage(packageName); - viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(viewIntent); - Log.d(TAG, "成功使用Web链接方式启动抖音"); - return true; - } catch (Exception e) { - Log.e(TAG, "Web链接方式失败: " + e.getMessage()); - } - - Log.e(TAG, "所有启动抖音的方法均失败"); - return false; + + launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(launchIntent); + return true; + } catch (Exception e) { - Log.e(TAG, "启动抖音过程中发生异常: " + e.getMessage(), e); - return false; + // 方法3: 最后的救命稻草 - 纯净版URL Scheme(不设置Package,绕过包名拦截) + try { + Uri uri = Uri.parse("snssdk1128://"); + Intent schemeIntent = new Intent(Intent.ACTION_VIEW, uri); + schemeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(schemeIntent); + return true; + } catch (Exception ex) { + Log.e(TAG, "纯净版Scheme启动抖音失败: " + ex.getMessage()); + } } + + return false; } /** @@ -287,70 +211,11 @@ public class DouYinIntentShareUtil { boolean isPackageDetected = isDouyinInstalled(); try { - // 使用兼容方式复制到剪贴板,作为兜底 - try { - copyToClipboard(activity, text); - } catch (Exception e) { - // 忽略 - } - - String packageName = getInstalledDouYinPackage(); - boolean launched = false; + // 复制到剪贴板 + copyToClipboard(activity, text); - // 方法1:优先尝试系统Intent Chooser,这是最可靠的方式 - try { - 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); - - // 抖音在卓易通环境下实际上不支持纯文本直接唤起分享(只能发图片视频) - // 这里使用 setPackage 直接拉起,如果没有效果则会跳转抖音首页 - intent.setPackage(packageName); - activity.startActivity(intent); - launched = true; - Log.d(TAG, "成功启动文本分享"); - activity.runOnUiThread(() -> Toast.makeText(activity, "成功启动文本分享", Toast.LENGTH_SHORT).show()); - } catch (Exception e) { - Log.e(TAG, "启动文本分享失败: " + e.getMessage()); - final String msg = "启动文本分享失败: " + e.getMessage(); - activity.runOnUiThread(() -> Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show()); - } - - // 方法2:如果分享Intent失败,尝试仅启动应用 - if (!launched) { - launched = tryLaunchDouyin(activity); - } - - if (launched) { - Toast.makeText(activity, "已将内容复制到剪贴板,请在抖音中粘贴并分享", Toast.LENGTH_LONG).show(); - - // 假设分享成功 - if (mCallback != null) { - new Handler(Looper.getMainLooper()).postDelayed(() -> { - mCallback.onSuccess(); - }, 1000); - } - return; - } - - // 如果所有方法都失败了,尝试使用系统分享菜单 - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("text/plain"); - shareIntent.putExtra(Intent.EXTRA_TEXT, text); - - Intent chooser = Intent.createChooser(shareIntent, "分享到"); - activity.startActivity(chooser); - Toast.makeText(activity, "请从分享列表中选择抖音", Toast.LENGTH_SHORT).show(); - - if (mCallback != null) { - new Handler(Looper.getMainLooper()).postDelayed(() -> { - mCallback.onSuccess(); - }, 1000); - } + // 弹出提示框引导用户 + activity.runOnUiThread(() -> showDouYinTextGuideDialog(activity, false)); } catch (Exception e) { Log.e(TAG, "分享过程中出现异常: " + e.getMessage(), e); handleShareException(activity, e); @@ -424,22 +289,12 @@ public class DouYinIntentShareUtil { if (!launched) { try { - Intent cleanIntent = new Intent(Intent.ACTION_SEND); - cleanIntent.setType("image/*"); - cleanIntent.putExtra(Intent.EXTRA_STREAM, imageUri); - cleanIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - - // 使用系统Chooser - Intent chooserIntent = Intent.createChooser(cleanIntent, "分享到抖音"); - chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - activity.startActivity(chooserIntent); + // 废弃系统Chooser,改用自定义引导弹窗 + activity.runOnUiThread(() -> showDouYinMediaGuideDialog(activity, false)); 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()); - final String failMsg2 = "Chooser失败: " + e.getMessage(); + Log.e(TAG, "引导弹窗分享失败: " + e.getMessage()); + final String failMsg2 = "引导弹窗失败: " + e.getMessage(); activity.runOnUiThread(() -> Toast.makeText(activity, failMsg2, Toast.LENGTH_SHORT).show()); } } @@ -529,8 +384,9 @@ public class DouYinIntentShareUtil { activity.runOnUiThread(() -> Toast.makeText(activity, "多图直接分享成功", Toast.LENGTH_SHORT).show()); } catch (Exception e) { Log.d(TAG, "直接分享多图失败: " + e.getMessage()); - final String msg = "直接分享多图失败: " + e.getMessage(); - activity.runOnUiThread(() -> Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show()); + // 直接分享失败,改用自定义引导弹窗 + activity.runOnUiThread(() -> showDouYinMediaGuideDialog(activity, false)); + launched = true; } } catch (Exception e) { handleShareException(activity, e); @@ -633,22 +489,12 @@ public class DouYinIntentShareUtil { if (!launched) { try { - Intent cleanIntent = new Intent(Intent.ACTION_SEND); - cleanIntent.setType("video/*"); - cleanIntent.putExtra(Intent.EXTRA_STREAM, videoUri); - cleanIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - - // 使用系统Chooser - Intent chooserIntent = Intent.createChooser(cleanIntent, "分享视频到抖音"); - chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - chooserIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - activity.startActivity(chooserIntent); + // 废弃系统Chooser,改用自定义引导弹窗 + activity.runOnUiThread(() -> showDouYinMediaGuideDialog(activity, true)); 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()); - final String failMsg2 = "Chooser视频失败: " + e.getMessage(); + Log.e(TAG, "引导弹窗分享视频失败: " + e.getMessage()); + final String failMsg2 = "引导弹窗视频失败: " + e.getMessage(); activity.runOnUiThread(() -> Toast.makeText(activity, failMsg2, Toast.LENGTH_SHORT).show()); } } @@ -686,13 +532,12 @@ public class DouYinIntentShareUtil { sb.append(title).append("\n\n"); } if (!TextUtils.isEmpty(description)) { - sb.append(description).append("\n\n"); - } - if (!TextUtils.isEmpty(webUrl)) { - sb.append(webUrl); + sb.append(description); } + + // 用户要求不需要分享链接,因此这里不再追加webUrl的内容 - shareTextToDouyin(activity, sb.toString()); + shareTextToDouyin(activity, sb.toString().trim()); } /** @@ -703,117 +548,23 @@ public class DouYinIntentShareUtil { * @param description 分享描述,可选 */ public void shareWebpageToDouyin(Activity activity, String url, String title, String description) { - // Strict check removed - - if (TextUtils.isEmpty(url)) { - Toast.makeText(activity, "分享链接不能为空", Toast.LENGTH_SHORT).show(); - if (mCallback != null) { - mCallback.onError(-1, "分享链接不能为空"); - } - return; - } - try { - String packageName = getInstalledDouYinPackage(); - // 构建完整分享内容 StringBuilder shareContent = new StringBuilder(); if (!TextUtils.isEmpty(title)) { shareContent.append(title).append("\n"); } if (!TextUtils.isEmpty(description)) { - shareContent.append(description).append("\n"); + shareContent.append(description); } - shareContent.append(url); + + // 用户要求不需要链接,分享的内容也不需要复制链接,因此不再追加url的内容 // 复制到剪贴板,便于用户在抖音中粘贴 - copyToClipboard(activity, shareContent.toString()); + copyToClipboard(activity, shareContent.toString().trim()); - // 方法1: 尝试使用系统分享直接发送到抖音 - Intent shareIntent = new Intent(Intent.ACTION_SEND); - 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到抖音"); - - // 延迟回调成功 - if (mCallback != null) { - new Handler(Looper.getMainLooper()).postDelayed(() -> { - mCallback.onSuccess(); - }, 1000); - } - return; - } catch (android.content.ActivityNotFoundException e) { - Log.e(TAG, "直接分享网页到抖音失败,尝试替代方法: " + e.getMessage()); - } - - // 方法2: 如果直接分享失败,尝试使用VIEW操作打开抖音分享页面 - try { - // 抖音支持的分享scheme,尝试不同的形式 - String[] shareSchemes = { - "snssdk1128://share?content=" + Uri.encode(shareContent.toString()), - "douyin://share?content=" + Uri.encode(shareContent.toString()), - "aweme://share?content=" + Uri.encode(shareContent.toString()) - }; - - for (String scheme : shareSchemes) { - try { - Intent schemeIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(scheme)); - schemeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - schemeIntent.setPackage(packageName); - activity.startActivity(schemeIntent); - Log.d(TAG, "成功使用scheme方式分享网页到抖音: " + scheme); - - // 延迟回调成功 - if (mCallback != null) { - new Handler(Looper.getMainLooper()).postDelayed(() -> { - mCallback.onSuccess(); - }, 1000); - } - return; - } catch (Exception schemeEx) { - Log.e(TAG, "scheme方式分享失败 " + scheme + ": " + schemeEx.getMessage()); - // 继续尝试下一个scheme - } - } - } catch (Exception e) { - Log.e(TAG, "scheme分享过程中出现异常: " + e.getMessage()); - } - - // 方法3: 如果前两种方法都失败,启动抖音并提示用户手动粘贴分享 - boolean launched = tryLaunchDouyin(activity); - if (launched) { - Toast.makeText(activity, "已将链接复制到剪贴板,请在抖音中粘贴并分享", Toast.LENGTH_LONG).show(); - - // 假设分享成功 - if (mCallback != null) { - new Handler(Looper.getMainLooper()).postDelayed(() -> { - mCallback.onSuccess(); - }, 1000); - } - return; - } - - // 方法4: 如果启动抖音也失败,尝试使用系统分享选择器 - Intent chooserIntent = Intent.createChooser(shareIntent.setPackage(null), "分享到"); - activity.startActivity(chooserIntent); - Toast.makeText(activity, "请从分享列表中选择抖音", Toast.LENGTH_SHORT).show(); - - // 假设分享成功 - if (mCallback != null) { - new Handler(Looper.getMainLooper()).postDelayed(() -> { - mCallback.onSuccess(); - }, 1000); - } + // 弹出提示框引导用户 + activity.runOnUiThread(() -> showDouYinTextGuideDialog(activity, true)); } catch (Exception e) { Log.e(TAG, "分享网页过程中出现异常: " + e.getMessage(), e); @@ -828,12 +579,8 @@ public class DouYinIntentShareUtil { */ private void startShareActivity(Activity activity, Intent intent) { try { - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - // 创建选择器并提示用户选择抖音 - Intent chooser = Intent.createChooser(intent, "分享到抖音"); - activity.startActivity(chooser); - Toast.makeText(activity, "请从列表中选择抖音", Toast.LENGTH_SHORT).show(); + // 废弃系统Chooser,统一使用引导弹窗 + activity.runOnUiThread(() -> showDouYinTextGuideDialog(activity, false)); // 假设分享成功 if (mCallback != null) { @@ -1077,11 +824,11 @@ public class DouYinIntentShareUtil { shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } - // 创建临时分享弹窗,辅助用户操作 - Intent chooser = Intent.createChooser(shareIntent, "请选择'抖音'"); - activity.startActivity(chooser); - - Toast.makeText(activity, "请在弹出窗口中选择抖音,进入群聊后再选择群组", Toast.LENGTH_LONG).show(); + // 废弃系统Chooser,改用自定义引导弹窗 + activity.runOnUiThread(() -> showDouYinMediaGuideDialog(activity, "video".equals(mediaType))); + + // 已在向导弹窗中引导用户 + // Toast.makeText(activity, "请在弹出窗口中选择抖音,进入群聊后再选择群组", Toast.LENGTH_LONG).show(); } catch (Exception e) { Log.e(TAG, "准备媒体分享失败: " + e.getMessage()); // 如果媒体分享失败,至少已经将文本内容复制到剪贴板 @@ -1178,6 +925,139 @@ public class DouYinIntentShareUtil { return false; } + + /** + * 显示抖音媒体(图片/视频)分享引导弹窗 + */ + private void showDouYinMediaGuideDialog(final Activity activity, boolean isVideo) { + android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(activity); + builder.setTitle("分享准备完成"); + builder.setCancelable(false); + + // 构建自定义视图 + android.widget.LinearLayout layout = new android.widget.LinearLayout(activity); + layout.setOrientation(android.widget.LinearLayout.VERTICAL); + int padding = dp2px(activity, 20); + layout.setPadding(padding, padding, padding, padding); + layout.setGravity(android.view.Gravity.CENTER_HORIZONTAL); + + // 状态提示 + android.widget.TextView statusTv = new android.widget.TextView(activity); + // 这里只是引导发送意图,默认文件其实就在本地,所以提示"准备就绪"或"已保存" + statusTv.setText(isVideo ? "✅ 视频分享准备就绪" : "✅ 图片分享准备就绪"); + statusTv.setTextColor(android.graphics.Color.parseColor("#4CAF50")); + statusTv.setTextSize(16); + statusTv.setTypeface(null, android.graphics.Typeface.BOLD); + statusTv.setGravity(android.view.Gravity.CENTER); + layout.addView(statusTv); + + // 间隔 + android.view.View space = new android.view.View(activity); + layout.addView(space, new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, dp2px(activity, 15))); + + // 步骤文本 + android.widget.TextView stepTv = new android.widget.TextView(activity); + stepTv.setText("分享到好友或群聊步骤:\n\n" + + "1. 点击下方按钮打开抖音\n" + + "2. 找到好友或群聊进入聊天界面\n" + + "3. 点击输入框旁的「+」号 ->「相册」\n" + + "4. 选择第一张" + (isVideo ? "视频" : "图片") + "发送即可"); + stepTv.setTextColor(android.graphics.Color.DKGRAY); + stepTv.setTextSize(14); + // 行间距 + stepTv.setLineSpacing(dp2px(activity, 4), 1.0f); + layout.addView(stepTv); + + builder.setView(layout); + + // 按钮 + builder.setPositiveButton("立即打开抖音", (dialog, which) -> { + boolean launched = tryLaunchDouyin(activity); + if (!launched) { + Toast.makeText(activity, "无法自动打开抖音,请手动打开应用进行分享", Toast.LENGTH_SHORT).show(); + } + if (mCallback != null) { + new Handler(Looper.getMainLooper()).postDelayed(() -> mCallback.onSuccess(), 1000); + } + }); + + builder.setNegativeButton("稍后分享", (dialog, which) -> { + if (mCallback != null) { + mCallback.onCancel(); + } + }); + + builder.show(); + } + + /** + * 显示抖音文本分享引导弹窗 + */ + private void showDouYinTextGuideDialog(final Activity activity, boolean isWebpage) { + android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(activity); + builder.setTitle("分享准备完成"); + builder.setCancelable(false); + + // 构建自定义视图 + android.widget.LinearLayout layout = new android.widget.LinearLayout(activity); + layout.setOrientation(android.widget.LinearLayout.VERTICAL); + int padding = dp2px(activity, 20); + layout.setPadding(padding, padding, padding, padding); + layout.setGravity(android.view.Gravity.CENTER_HORIZONTAL); + + // 状态提示 + android.widget.TextView statusTv = new android.widget.TextView(activity); + statusTv.setText(isWebpage ? "✅ 链接已复制到剪贴板" : "✅ 文本已复制到剪贴板"); + statusTv.setTextColor(android.graphics.Color.parseColor("#4CAF50")); + statusTv.setTextSize(16); + statusTv.setTypeface(null, android.graphics.Typeface.BOLD); + statusTv.setGravity(android.view.Gravity.CENTER); + layout.addView(statusTv); + + // 间隔 + android.view.View space = new android.view.View(activity); + layout.addView(space, new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, dp2px(activity, 15))); + + // 步骤文本 + android.widget.TextView stepTv = new android.widget.TextView(activity); + stepTv.setText("分享到好友或群聊步骤:\n\n" + + "1. 点击下方按钮打开抖音\n" + + "2. 找到好友或群聊进入聊天界面\n" + + "3. 在底部输入框长按选择「粘贴」\n" + + "4. 点击发送即可完成分享"); + stepTv.setTextColor(android.graphics.Color.DKGRAY); + stepTv.setTextSize(14); + // 行间距 + stepTv.setLineSpacing(dp2px(activity, 4), 1.0f); + layout.addView(stepTv); + + builder.setView(layout); + + // 按钮 + builder.setPositiveButton("立即打开抖音", (dialog, which) -> { + boolean launched = tryLaunchDouyin(activity); + if (!launched) { + Toast.makeText(activity, "无法自动打开抖音,请手动打开应用进行粘贴分享", Toast.LENGTH_SHORT).show(); + } + if (mCallback != null) { + new Handler(Looper.getMainLooper()).postDelayed(() -> mCallback.onSuccess(), 1000); + } + }); + + builder.setNegativeButton("稍后分享", (dialog, which) -> { + if (mCallback != null) { + mCallback.onCancel(); + } + }); + + builder.show(); + } + + private static int dp2px(Context context, float dp) { + float scale = context.getResources().getDisplayMetrics().density; + return (int) (dp * scale + 0.5f); + } + /** * 抖音分享回调接口 */ diff --git a/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java b/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java index 4a77f30..ac9975d 100644 --- a/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java +++ b/app/src/main/java/com/tsgame/tsgame_niuniu/util/QQIntentShareUtil.java @@ -717,35 +717,56 @@ public class QQIntentShareUtil { * 所以我们通过原生的 intent 送入 createChooser,然后利用 EXTRA_EXCLUDE_COMPONENTS 排除抖音。 */ private Intent createTargetedChooserIntent(Activity activity, Intent targetIntent, CharSequence title) { - // 重要:确保本体 intent 不要携带 package 限制,否则在卓易通系统的 chooser 会失效静默 + String packageName = getInstalledQQPackage(); + + // 清理现场:如果带有被隐式拦截的 package 再去查询,查出来的结果是空的。 targetIntent.setPackage(null); targetIntent.setComponent(null); + PackageManager pm = activity.getPackageManager(); + + try { + // 第一步:全局海选。不再限定包名,直接拿最原始的 intent 去查手机里【所有的】分享接收器。 + // 这样能避开卓易通对 setPackage 隐式意图的严格 API 拦截。 + List resInfo = pm.queryIntentActivities(targetIntent, PackageManager.MATCH_DEFAULT_ONLY); + ComponentName selectedComponent = null; + + if (resInfo != null && !resInfo.isEmpty()) { + // 遍历系统诚实返回的列表,自己把 QQ 挑出来 + for (android.content.pm.ResolveInfo info : resInfo) { + if (info.activityInfo != null && packageName.equals(info.activityInfo.packageName)) { + // 抓到了!系统真正在当前操作(文字/图片分享)下分配的 QQ 接收组件名! + selectedComponent = new ComponentName(info.activityInfo.packageName, info.activityInfo.name); + break; + } + } + } + + if (selectedComponent != null) { + // 找到完美的对应组件,走显式跳转,直接砸过去!不经过 Chooser,绝对没有抖音。 + targetIntent.setComponent(selectedComponent); + return targetIntent; + } + } catch (Exception e) { + Log.e(TAG, "动态查找QQ专属分享组件失败", e); + } + + // 第二步 兜底防奔溃: + // 如果上面的海选连 QQ 都查不到(或者某些变态系统彻底封禁了 queryIntentActivities 接口), + // 如果我们这时候再去硬写 setComponent(JumpActivity),就会报您刚才看到的: + // "Unable to find explicit activity class..." 的致命奔溃错误。 + // 所以,到了这一步,宁可向系统低头唤出 Chooser,也绝不能让应用闪退奔溃。 Intent chooser = Intent.createChooser(targetIntent, title); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - try { - // 找出抖音可能接收分享的所有组件 - Intent queryIntent = new Intent(targetIntent.getAction()); - queryIntent.setType(targetIntent.getType()); - queryIntent.setPackage("com.ss.android.ugc.aweme"); - List resInfo = activity.getPackageManager().queryIntentActivities(queryIntent, 0); - - List excludedComponents = new ArrayList<>(); - if (resInfo != null && !resInfo.isEmpty()) { - for (android.content.pm.ResolveInfo info : resInfo) { - excludedComponents.add(new ComponentName(info.activityInfo.packageName, info.activityInfo.name)); - } - } else { - // 兜底硬编码过滤最常见的涉事抖音组件 - excludedComponents.add(new ComponentName("com.ss.android.ugc.aweme", "com.ss.android.ugc.aweme.share.ShareToAwemeActivity")); - } - - chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponents.toArray(new ComponentName[0])); - } catch (Exception e) { - Log.e(TAG, "设置排他组件失败", e); - } - } + try { + // 尽最后的人事,附上黑名单作为尝试屏蔽 + ComponentName[] excludes = new ComponentName[] { + new ComponentName("com.ss.android.ugc.aweme", "com.ss.android.ugc.aweme.share.SystemShareActivity"), + new ComponentName("com.ss.android.ugc.aweme", "com.ss.android.ugc.aweme.share.ShareToAwemeActivity"), + new ComponentName("com.ss.android.ugc.aweme", "com.ss.android.ugc.aweme.shortvideo.ui.VideoRecordNewActivity") + }; + chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludes); + } catch (Exception e) {} return chooser; } diff --git a/keystore/daoqi_game_1.txt b/keystore/daoqi_game_1.txt new file mode 100644 index 0000000..f263557 --- /dev/null +++ b/keystore/daoqi_game_1.txt @@ -0,0 +1,30 @@ +密钥库类型: PKCS12 +密钥库提供方: SunJSSE + +您的密钥库包含 1 个条目 + +别名: gamehall +创建日期: 2026-3-5 +条目类型: PrivateKeyEntry +证书链长度: 1 +证书[1]: +所有者: L=CN, O=daoqi, OU=daoqi, CN=daoqi +发布者: L=CN, O=daoqi, OU=daoqi, CN=daoqi +序列号: 1 +生效时间: Thu Mar 05 08:16:17 CST 2026, 失效时间: Mon Feb 27 08:16:17 CST 2051 +证书指纹: + SHA1: 67:D1:7E:0E:E9:E7:C0:D0:93:AA:92:45:90:4C:33:16:C8:DB:7D:DB + SHA256: 49:8F:C8:CC:AB:BB:38:A1:C5:29:FB:52:D9:00:D7:9E:B8:F9:9E:75:C3:DB:08:27:BD:09:D5:53:75:82:F0:2F +签名算法名称: SHA256withRSA +主体公共密钥算法: 2048 位 RSA 密钥 +版本: 1 + + +******************************************* +******************************************* + + + + +微信开放平台应用签名: +d9e138b6f20acfa14ae73113c7e44727 diff --git a/keystore/daoqi_game_2.keystore b/keystore/daoqi_game_2.keystore new file mode 100644 index 0000000000000000000000000000000000000000..afc46bc835305992a4b047c3cf379415fe76091b GIT binary patch literal 2588 zcma)8X*3j!8a87FBU2hPr3e{YlRh(F!^hYf${@;;Wo#iN zM0Q59MKNJy_qjyKQcTx9_ny9Uf8G1zJgQ&I3`v*@txIVWsgL`HxG09{|jufVB=uHMH|D2N;UB zLM#8>3ZTz};GL?4$_!&tCj)(*(=}>1PBb+!0s>_PfdC1#01w~4Hv%DGF7z25h<&sk z;5Ii1fC32`Z0{#E-DuX}{4ni?4&f|76wsjBUTp1}$wnwrYsN-d-Jc_xPI>_G{B~Mj zyTY<|uiJAO9mg85f`zQgidb!1}qQTEB7Od*`O>Sv^f+~yN|hv2A2$dwIA z=j#(wj|#QGDmDVU`IL^9?f35xYYK8*m$JBLbe4lM3Tw{=3RI6~4QP@BH&HR>1fXMU zY}*k{pUwjFC*x+upG)>n)K%9xl1z!R7UZr(w^X8|;5hY6z)gtLtBeY@n_^=_godNZ zW`3QnEy4lPlbglpyOsm31J*3!Uhgw~!gt@7gwN|M876PmwpHVoe?D(0os&oRHJ5(} zD2_5Oqa#aY=^k@2`G0CQ} zW?2X*sXTeIvq@Sa?f}cQdst{OR}v=XReCIJF;qs@sjV^N+(ehHlvW1jZGP|xlzSx| zoS%rTpFfg+R!zdT^*LSfmV2h*J$c;`!9`Q1MlQTlP7Xim zRj^B{z2=8_SjGL)67?wcljnq1Gii~zs&$eB`e3Sm?GJot#k++eON3B1c#NRHR-Qpl zE5fiTgDS%Z^^KRpDWAeIRrLmM-wXumFAK7x}Y{(Q^%y&ar z=k-o&h@e;p{z<~c&`I^^ElO>HYp{mI=nnWokb8J~tvcG8R?G%;g^PF%K-J~va0GjO zDmnijabc!2oeeklgm)B>%bIuz!@3OI*@?Hw;%;01odsMCeBze(P7sU42KXm&Y*yRHoStg&$GfEY zs(J5$>CytOStV>~E?9q9nz{qR)gD_@5Nqu%wC;hj6|r3JlI20vsMk-^!MgS~=^N~k ztEB9m@ym4_hm6@ND((eNB!VDy69Z?q=$5S_MFlZmV_)pNh$90t> zzMJrmtqiv!fQF)HTEp-UN}();OGAH935aYX*g;WyUtLo|5zsPlEM08m{Hd%3Ih|C^ ztQZx>U;!jTp3&xkF#|Sy8Zu0IxUrkB#V^1uN5h-jXEAL#6{g9kuSfy+y0RjUD!OYz}Z%bhCcttE; zMM(*Z!=TX=?ytW@ygWG+?wLc14FqrO%Q^q7Dh!86mI*RiJ^fux$$6lZXjZywm=rYB(Gz{stSNoZ*;`Q zznPW$9r{r^Vv9*%On${n4P5Mp-P4LT-B>Wpdh8~2Pt5gY*&CH3X|`DcaqEK`%J%dZ zA$5aP*Lw;`Bk=<#vOlb+fp)}+F*;o_4ntS%mvmkUBs4Jg~H+;CUi0DcX$ zp^{SKtoxpDs}X=VY)aOYwdApO`|8)JH*&RRshyEtVkw`#XX^5o+ge-u2e$+C4%sO{ zN%!KEXN7hdvZ`5*?yM9Rq>7zQ- zAW5N#wa~&Du^N%zZL=LqWX?nJ+s9M613F6D9IU(*@3mN^1W*5UD5+dcN6 zL?A0bds&0McI=7Zw^31_g%tI|vVlZ1Mx21qA0_n$v{~EBsuaa^CU<-Lb73hm-T6F( zhc8`Homqp-09`vJ-LE;y_(qh*b!FO(rHs0ccGk^Uhx<<*dC=cq`Yg3bf{1D_$s6vK z)i=$`1$=ljRG19vAp4LT38u_{fn}R0Cu02S*w^{VKO1X^CxgtPeT}JR4_D zXLo8M9NU*S!>;Jju9_XFRu<0^#db_DW;ZIBPQ(OA2CW`wcI34>VJo5Im-lw>Rk1wQ zI`X{!iqOo->hfjD!FIZ}jn5zbTHD0Sad6gXSg2LAx6Al3XxqaCT}`sMdut{Oye*06 zpowS<8v5&F0s_EXAc@AkfyS}6;2;L1TY@doN2-008G3r%%nPz{YGl45-xmaLIm@hf XniYw^G3I1#7+I3*7Vr4yzfSz0U_-0~ literal 0 HcmV?d00001 diff --git a/keystore/daoqi_game_2.txt b/keystore/daoqi_game_2.txt new file mode 100644 index 0000000..0252308 --- /dev/null +++ b/keystore/daoqi_game_2.txt @@ -0,0 +1,30 @@ +密钥库类型: PKCS12 +密钥库提供方: SunJSSE + +您的密钥库包含 1 个条目 + +别名: gamehall +创建日期: 2026-3-14 +条目类型: PrivateKeyEntry +证书链长度: 1 +证书[1]: +所有者: O=daoqi, OU=daoqi, CN=daoqi +发布者: O=daoqi, OU=daoqi, CN=daoqi +序列号: 1 +生效时间: Sat Mar 14 17:14:24 CST 2026, 失效时间: Wed Mar 08 17:14:24 CST 2051 +证书指纹: + SHA1: 2F:76:97:3D:DC:E5:EA:56:7A:2B:53:E6:24:EF:74:CF:12:DF:A6:09 + SHA256: B8:73:5A:3E:90:57:49:95:F7:B8:BB:0F:05:E7:76:7C:27:96:F8:5E:6F:66:96:4E:F0:0F:69:B1:E9:22:28:2F +签名算法名称: SHA256withRSA +主体公共密钥算法: 2048 位 RSA 密钥 +版本: 1 + + +******************************************* +******************************************* + + + + +微信开放平台应用签名: +6f0e6ad5c028c9824eeb55c222c0f1af diff --git a/keystore/daoqi_game_3.keystore b/keystore/daoqi_game_3.keystore new file mode 100644 index 0000000000000000000000000000000000000000..f624f20c493d1bdb6e1d4fcc9a45bcbaf669495e GIT binary patch literal 2588 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