chore: 批量代码优化与功能迭代更新

本次提交包含大量代码优化、功能新增与服务端配置更新:
1. 修复分析报告统计数据,调整CMake策略设置
2. 优化APP权限配置、编辑器与聊天界面组件
3. 更新依赖库版本与pubspec配置
4. 新增文件传输服务端、信令服务器相关配置与脚本
5. 完善用户注销功能与数据库迁移脚本
6. 优化多处动画效果、代码风格与日志输出
7. 新增多种调试与部署脚本,修复已知BUG
This commit is contained in:
Developer
2026-05-12 06:28:04 +08:00
parent 72f64f9ca9
commit 283950ea07
245 changed files with 50255 additions and 6160 deletions

View File

@@ -24,6 +24,36 @@
<!-- ============================================================ -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- ============================================================ -->
<!-- NFC权限 — 文件传输NFC触碰配对 -->
<!-- ============================================================ -->
<uses-permission android:name="android.permission.NFC" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
<!-- ============================================================ -->
<!-- 蓝牙权限 — 文件传输BLE配对 -->
<!-- Android 12+: BLUETOOTH_SCAN/CONNECT/ADVERTISE -->
<!-- Android 11及以下: BLUETOOTH/BLUETOOTH_ADMIN -->
<!-- ============================================================ -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
<!-- ============================================================ -->
<!-- WiFi多播权限 — LocalSend设备发现 -->
<!-- ============================================================ -->
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<application
android:label="xianyan"
android:name="${applicationName}"

View File

@@ -1,5 +1,14 @@
package com.example.xianyan
import android.os.Bundle
import com.xianyan.ble.BleAdvertiserPlugin
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()
class MainActivity : FlutterActivity() {
private val bleAdvertiser = BleAdvertiserPlugin()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bleAdvertiser.setupChannel(flutterEngine!!, this)
}
}

View File

@@ -0,0 +1,89 @@
package com.xianyan.ble
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.bluetooth.le.AdvertiseCallback
import android.bluetooth.le.AdvertiseData
import android.bluetooth.le.AdvertiseSettings
import android.content.Context
import android.os.ParcelUuid
import android.util.Log
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class BleAdvertiserPlugin : AdvertiseCallback() {
companion object {
private const val TAG = "BleAdvertiserPlugin"
private const val CHANNEL = "com.xianyan/ble"
}
private var isAdvertising = false
private var adapter: BluetoothAdapter? = null
fun setupChannel(flutterEngine: FlutterEngine, context: Context) {
val bm = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
adapter = bm.adapter
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
when (call.method) {
"startAdvertising" -> {
val serviceUuid = call.argument<String>("serviceUuid") ?: ""
val payload = call.argument<String>("payload") ?: ""
startAdvertising(serviceUuid, payload, result)
}
"stopAdvertising" -> {
stopAdvertising(result)
}
else -> result.notImplemented()
}
}
}
private fun startAdvertising(
serviceUuid: String,
payload: String,
result: MethodChannel.Result,
) {
val leAdvertiser = adapter?.bluetoothLeAdvertiser
if (leAdvertiser == null) {
result.error("UNAVAILABLE", "BLE advertiser not available", null)
return
}
val settings = AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setConnectable(false)
.setTimeout(0)
.build()
val serviceParcelUuid = ParcelUuid.fromString(serviceUuid)
val serviceData = payload.toByteArray(Charsets.UTF_8)
val data = AdvertiseData.Builder()
.addServiceUuid(serviceParcelUuid)
.addServiceData(serviceParcelUuid, serviceData)
.setIncludeDeviceName(false)
.build()
leAdvertiser.startAdvertising(settings, data, this)
isAdvertising = true
result.success(true)
}
private fun stopAdvertising(result: MethodChannel.Result) {
val leAdvertiser = adapter?.bluetoothLeAdvertiser
leAdvertiser?.stopAdvertising(this)
isAdvertising = false
result.success(true)
}
override fun onStartSuccess(settingsInEffect: AdvertiseSettings) {
Log.i(TAG, "BLE advertising started successfully")
}
override fun onStartFailure(errorCode: Int) {
isAdvertising = false
Log.e(TAG, "BLE advertising start failed: $errorCode")
}
}

File diff suppressed because one or more lines are too long