chore: 批量代码优化与功能迭代更新
本次提交包含大量代码优化、功能新增与服务端配置更新: 1. 修复分析报告统计数据,调整CMake策略设置 2. 优化APP权限配置、编辑器与聊天界面组件 3. 更新依赖库版本与pubspec配置 4. 新增文件传输服务端、信令服务器相关配置与脚本 5. 完善用户注销功能与数据库迁移脚本 6. 优化多处动画效果、代码风格与日志输出 7. 新增多种调试与部署脚本,修复已知BUG
This commit is contained in:
@@ -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}"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user