From 65a143bec2b3622a766381e18f30f6d1d6d256f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A6=E5=90=9B?= <73606411+setube@users.noreply.github.com> Date: Sat, 20 Dec 2025 02:32:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81Android=E7=AB=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=87=BA=E4=B8=8E=E5=88=86=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 引入@capacitor/filesystem与@capacitor/share,实现Android端通过原生文件系统导出数据并调用系统分享面板。新增colors.xml并调整MainActivity,设置状态栏与导航栏颜色,提升原生端显示一致性。 --- .../java/games/wenzi/ogame/MainActivity.java | 15 +++++++++- android/app/src/main/res/values/colors.xml | 4 +++ package.json | 2 ++ pnpm-lock.yaml | 30 +++++++++++++++++++ src/views/SettingsView.vue | 23 +++++++++++++- 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 android/app/src/main/res/values/colors.xml diff --git a/android/app/src/main/java/games/wenzi/ogame/MainActivity.java b/android/app/src/main/java/games/wenzi/ogame/MainActivity.java index 1db8bd9..8eeb0c5 100644 --- a/android/app/src/main/java/games/wenzi/ogame/MainActivity.java +++ b/android/app/src/main/java/games/wenzi/ogame/MainActivity.java @@ -1,5 +1,18 @@ package games.wenzi.ogame; +import android.os.Bundle; +import android.view.Window; +import androidx.core.content.ContextCompat; import com.getcapacitor.BridgeActivity; -public class MainActivity extends BridgeActivity {} +public class MainActivity extends BridgeActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 设置状态栏颜色,防止 Capacitor 强制透明 + Window window = getWindow(); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.status_bar_color)); + window.setNavigationBarColor(ContextCompat.getColor(this, R.color.status_bar_color)); + } +} diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..30d2a3c --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #1a1a2e + diff --git a/package.json b/package.json index 75dc586..5007d7d 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "@capacitor/app": "^8.0.0", "@capacitor/cli": "^8.0.0", "@capacitor/core": "^8.0.0", + "@capacitor/filesystem": "^8.0.0", + "@capacitor/share": "^8.0.0", "@tailwindcss/vite": "^4.1.17", "@tanstack/vue-table": "^8.21.3", "@vueuse/core": "^14.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8237289..c8493af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,12 @@ importers: '@capacitor/core': specifier: ^8.0.0 version: 8.0.0 + '@capacitor/filesystem': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/core@8.0.0) + '@capacitor/share': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/core@8.0.0) '@tailwindcss/vite': specifier: ^4.1.17 version: 4.1.17(rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)) @@ -666,6 +672,19 @@ packages: '@capacitor/core@8.0.0': resolution: {integrity: sha512-250HTVd/W/KdMygoqaedisvNbHbpbQTN2Hy/8ZYGm1nAqE0Fx7sGss4l0nDg33STxEdDhtVRoL2fIaaiukKseA==} + '@capacitor/filesystem@8.0.0': + resolution: {integrity: sha512-RRGNLW9xEqvVVHGyGlfS4Oy0R3Na+bEefwZElKbex22S9eZr5cg8wc750BPPVwbcv5lf5fJymkY8x8y6UwKPyg==} + peerDependencies: + '@capacitor/core': '>=8.0.0' + + '@capacitor/share@8.0.0': + resolution: {integrity: sha512-VU+xT4LFwr4keIC0UKDqGQVAiNlAHwoTMQg8wVVSxtn/k32VOvvtqFfu63qnXr40WKytZWrxJfVESvRjd761yg==} + peerDependencies: + '@capacitor/core': '>=8.0.0' + + '@capacitor/synapse@1.0.4': + resolution: {integrity: sha512-/C1FUo8/OkKuAT4nCIu/34ny9siNHr9qtFezu4kxm6GY1wNFxrCFWjfYx5C1tUhVGz3fxBABegupkpjXvjCHrw==} + '@csstools/cascade-layer-name-parser@2.0.5': resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} engines: {node: '>=18'} @@ -5115,6 +5134,17 @@ snapshots: dependencies: tslib: 2.8.1 + '@capacitor/filesystem@8.0.0(@capacitor/core@8.0.0)': + dependencies: + '@capacitor/core': 8.0.0 + '@capacitor/synapse': 1.0.4 + + '@capacitor/share@8.0.0(@capacitor/core@8.0.0)': + dependencies: + '@capacitor/core': 8.0.0 + + '@capacitor/synapse@1.0.4': {} + '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) diff --git a/src/views/SettingsView.vue b/src/views/SettingsView.vue index ef279bf..ff1a18b 100644 --- a/src/views/SettingsView.vue +++ b/src/views/SettingsView.vue @@ -333,6 +333,9 @@ } from 'lucide-vue-next' import { saveAs } from 'file-saver' import { toast } from 'vue-sonner' + import { Capacitor } from '@capacitor/core' + import { Filesystem, Directory } from '@capacitor/filesystem' + import { Share } from '@capacitor/share' import pkg from '../../package.json' import { checkLatestVersion, canCheckVersion } from '@/utils/versionCheck' import type { VersionInfo } from '@/utils/versionCheck' @@ -523,7 +526,25 @@ const fileName = `${pkg.name}-${new Date().toISOString().slice(0, 10)}-${Date.now()}.json` const jsonString = JSON.stringify(exportData, null, 2) - saveAs(new Blob([jsonString], { type: 'application/json' }), fileName) + + // Android 使用 Capacitor Filesystem + Share + if (Capacitor.isNativePlatform()) { + // 写入文件到缓存目录 + const result = await Filesystem.writeFile({ + path: fileName, + data: jsonString, + directory: Directory.Cache + }) + // 分享文件让用户选择保存位置 + await Share.share({ + title: t('settings.exportData'), + url: result.uri, + dialogTitle: t('settings.exportData') + }) + } else { + // Web 使用 file-saver + saveAs(new Blob([jsonString], { type: 'application/json' }), fileName) + } toast.success(t('settings.exportSuccess')) } catch (error) { console.error('Export failed:', error)