mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 07:55:11 +08:00
feat: 支持Android端数据导出与分享
引入@capacitor/filesystem与@capacitor/share,实现Android端通过原生文件系统导出数据并调用系统分享面板。新增colors.xml并调整MainActivity,设置状态栏与导航栏颜色,提升原生端显示一致性。
This commit is contained in:
@@ -1,5 +1,18 @@
|
|||||||
package games.wenzi.ogame;
|
package games.wenzi.ogame;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.Window;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
import com.getcapacitor.BridgeActivity;
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
4
android/app/src/main/res/values/colors.xml
Normal file
4
android/app/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="status_bar_color">#1a1a2e</color>
|
||||||
|
</resources>
|
||||||
@@ -26,6 +26,8 @@
|
|||||||
"@capacitor/app": "^8.0.0",
|
"@capacitor/app": "^8.0.0",
|
||||||
"@capacitor/cli": "^8.0.0",
|
"@capacitor/cli": "^8.0.0",
|
||||||
"@capacitor/core": "^8.0.0",
|
"@capacitor/core": "^8.0.0",
|
||||||
|
"@capacitor/filesystem": "^8.0.0",
|
||||||
|
"@capacitor/share": "^8.0.0",
|
||||||
"@tailwindcss/vite": "^4.1.17",
|
"@tailwindcss/vite": "^4.1.17",
|
||||||
"@tanstack/vue-table": "^8.21.3",
|
"@tanstack/vue-table": "^8.21.3",
|
||||||
"@vueuse/core": "^14.1.0",
|
"@vueuse/core": "^14.1.0",
|
||||||
|
|||||||
30
pnpm-lock.yaml
generated
30
pnpm-lock.yaml
generated
@@ -23,6 +23,12 @@ importers:
|
|||||||
'@capacitor/core':
|
'@capacitor/core':
|
||||||
specifier: ^8.0.0
|
specifier: ^8.0.0
|
||||||
version: 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':
|
'@tailwindcss/vite':
|
||||||
specifier: ^4.1.17
|
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))
|
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':
|
'@capacitor/core@8.0.0':
|
||||||
resolution: {integrity: sha512-250HTVd/W/KdMygoqaedisvNbHbpbQTN2Hy/8ZYGm1nAqE0Fx7sGss4l0nDg33STxEdDhtVRoL2fIaaiukKseA==}
|
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':
|
'@csstools/cascade-layer-name-parser@2.0.5':
|
||||||
resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==}
|
resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -5115,6 +5134,17 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
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)':
|
'@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:
|
dependencies:
|
||||||
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
|
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
|
||||||
|
|||||||
@@ -333,6 +333,9 @@
|
|||||||
} from 'lucide-vue-next'
|
} from 'lucide-vue-next'
|
||||||
import { saveAs } from 'file-saver'
|
import { saveAs } from 'file-saver'
|
||||||
import { toast } from 'vue-sonner'
|
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 pkg from '../../package.json'
|
||||||
import { checkLatestVersion, canCheckVersion } from '@/utils/versionCheck'
|
import { checkLatestVersion, canCheckVersion } from '@/utils/versionCheck'
|
||||||
import type { VersionInfo } 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 fileName = `${pkg.name}-${new Date().toISOString().slice(0, 10)}-${Date.now()}.json`
|
||||||
const jsonString = JSON.stringify(exportData, null, 2)
|
const jsonString = JSON.stringify(exportData, null, 2)
|
||||||
|
|
||||||
|
// 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)
|
saveAs(new Blob([jsonString], { type: 'application/json' }), fileName)
|
||||||
|
}
|
||||||
toast.success(t('settings.exportSuccess'))
|
toast.success(t('settings.exportSuccess'))
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Export failed:', error)
|
console.error('Export failed:', error)
|
||||||
|
|||||||
Reference in New Issue
Block a user