diff --git a/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/AmapServicePlugin.kt b/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/AmapServicePlugin.kt index e28e7a484..e9f9d08d6 100644 --- a/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/AmapServicePlugin.kt +++ b/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/AmapServicePlugin.kt @@ -1,7 +1,13 @@ package com.yunqiinnovation.amap_service import android.app.Activity +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build +import android.util.Log +import androidx.core.content.ContextCompat.registerReceiver import com.amap.api.navi.AMapNaviView import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.EventChannel @@ -98,4 +104,6 @@ class AmapServicePlugin: FlutterPlugin, MethodCallHandler,EventChannel.StreamHan } + + } diff --git a/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationActivity.kt b/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationActivity.kt index 9009ec725..c900c32d5 100644 --- a/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationActivity.kt +++ b/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationActivity.kt @@ -1,6 +1,10 @@ package com.yunqiinnovation.amap_service +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity @@ -23,7 +27,7 @@ import com.amap.api.navi.model.AimLessModeCongestionInfo import com.amap.api.navi.model.AimLessModeStat import com.amap.api.navi.model.NaviInfo import com.amap.api.navi.model.NaviLatLng -import com.yunqiinnovation.amap_service.NavigationService.Companion.sharedNavi + class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewListener { private lateinit var naviView: AMapNaviView @@ -32,6 +36,7 @@ class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewLi private var startpos:String = ""; private var endpos:String = ""; private var ntype:String = ""; + private var isReceiverRegistered = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_navigation) @@ -60,7 +65,31 @@ class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewLi } navi?.addAMapNaviListener(this); - // 绑定当前 activity 到导航状态 + + // 注册广播监听器 + val filter = IntentFilter().apply { + addAction("com.yunqiinnovation.amap_service.EXIT_NAVIGATION") + } + + // Android 14+ 需要指定 flag + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(controlReceiver, filter, Context.RECEIVER_NOT_EXPORTED) + } else { + registerReceiver(controlReceiver, filter) + } + isReceiverRegistered = true + } + + private val controlReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + Log.i("NavigationActivity", "接受到通知事件 ${intent?.action}") + when (intent?.action) { + "com.yunqiinnovation.amap_service.EXIT_NAVIGATION" -> { + Log.d("NavigationService", "收到退出导航广播,准备停止服务") + finish() + } + } + } } override fun onResume() { @@ -80,6 +109,10 @@ class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewLi NavigationServiceHelper.startNavigation(context,"stop") naviView.onDestroy() super.onDestroy() + if (isReceiverRegistered) { + unregisterReceiver(controlReceiver) + isReceiverRegistered = false + } Log.i("NavigationActivity", "liwei------------------- onDestroy!") } diff --git a/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationService.kt b/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationService.kt index dceab4f76..c926010b0 100644 --- a/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationService.kt +++ b/local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationService.kt @@ -3,8 +3,10 @@ package com.yunqiinnovation.amap_service import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.graphics.Bitmap import android.os.Build import android.os.IBinder @@ -52,11 +54,24 @@ class NavigationService: Service(),AMapNaviListener { fun isServiceRunning() = isRunning.get() } - + private var isReceiverRegistered = false override fun onCreate() { super.onCreate() instance = this startForegroundNotification() + + // 注册广播监听器 + val filter = IntentFilter().apply { + addAction("com.yunqiinnovation.amap_service.EXIT_NAVIGATION") + } + + // Android 14+ 需要指定 flag + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(controlReceiver, filter, Context.RECEIVER_NOT_EXPORTED) + } else { + registerReceiver(controlReceiver, filter) + } + isReceiverRegistered = false } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { @@ -84,7 +99,17 @@ class NavigationService: Service(),AMapNaviListener { } return START_STICKY } - + private val controlReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + Log.i(TAG, "接受到通知事件 ${intent?.action}") + when (intent?.action) { + "com.yunqiinnovation.amap_service.EXIT_NAVIGATION" -> { + Log.d("NavigationService", "收到退出导航广播,准备停止服务") + stopNavigation(); + } + } + } + } private fun initializeAMapNavi() { try { sharedNavi = AMapNavi.getInstance(applicationContext).apply { @@ -399,4 +424,15 @@ class NavigationService: Service(),AMapNaviListener { Log.e(TAG, "onGpsSignalWeak! $p0") // TODO("Not yet implemented") } + + + override fun onDestroy() { + if (isReceiverRegistered) { + unregisterReceiver(controlReceiver) + isReceiverRegistered = false + } + stopForeground(true) + isRunning.set(false) + super.onDestroy() + } } \ No newline at end of file diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt index 794b66547..672c29634 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt @@ -163,7 +163,17 @@ class SystemFunctionHandler(private val context: Context? = null) { ), handler = MediaPauseHandler(context) ) - + // 注册媒体暂停功能 + client.registerLocalFunction( + name = "media_close", + description = "关闭媒体播放", + parameters = mapOf( + "type" to "object", + "properties" to emptyMap(), + "required" to emptyList() + ), + handler = MediaCloseHandler(context) + ) // 注册媒体上一首功能 client.registerLocalFunction( name = "media_previous", @@ -199,6 +209,32 @@ class SystemFunctionHandler(private val context: Context? = null) { ), handler = OpenRecorderHandler(context) ) + + // 注册退出交互函数 + client.registerLocalFunction( + name = "exit_navigation", + description = "结束当前导航服务", + parameters = mapOf( + "type" to "object", + "properties" to emptyMap(), + "required" to emptyList() + ), + handler = ExitNavigationHandler(context) + ) + } +} + +/** + * 退出导航服务 + */ +private class ExitNavigationHandler(private val context: Context?) : FunctionHandler { + override suspend fun handle(arguments: Map): String { + // 发送广播通知退出交互 + val intent = Intent("com.yunqiinnovation.amap_service.EXIT_NAVIGATION").apply { + setPackage(context?.packageName) // 设置包名使其成为显式 Intent + } + context?.sendBroadcast(intent) + return "{\"result\": \"已结束当前导航服务\"}" } } @@ -417,7 +453,20 @@ private class MediaPauseHandler(private val context: Context?) : FunctionHandler return "{\"result\": \"已暂停媒体播放\"}" } } - +/** + * 媒体暂停处理器 + */ +private class MediaCloseHandler(private val context: Context?) : FunctionHandler { + override suspend fun handle(arguments: Map): String { + Log.d("MediaPauseHandler", "📤 正在发送广播 context = $context") + // 发送媒体暂停广播 + val intent = Intent("com.yunqiinnovation.music_service.MEDIA_CLOSE").apply { + setPackage(context?.packageName) // 设置包名使其成为显式 Intent + } + context?.sendBroadcast(intent) + return "{\"result\": \"已关闭媒体播放\"}" + } +} /** * 媒体上一首处理器 */ diff --git a/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt b/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt index d346baed0..dfe71e4c2 100644 --- a/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt +++ b/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt @@ -60,6 +60,7 @@ class MusicService : MediaBrowserServiceCompat() { val filter = IntentFilter().apply { addAction("com.yunqiinnovation.music_service.MEDIA_PLAY") addAction("com.yunqiinnovation.music_service.MEDIA_PAUSE") + addAction("com.yunqiinnovation.music_service.MEDIA_CLOSE") addAction("com.yunqiinnovation.music_service.MEDIA_PREVIOUS") addAction("com.yunqiinnovation.music_service.MEDIA_NEXT") } @@ -132,6 +133,10 @@ class MusicService : MediaBrowserServiceCompat() { Log.i(TAG, "收到 MEDIA_PLAY 广播") resume() } + "com.yunqiinnovation.music_service.MEDIA_CLOSE" -> { + Log.i(TAG, "收到 MEDIA_CLOSE 广播") + stopSelf() + } "com.yunqiinnovation.music_service.MEDIA_PREVIOUS" -> { Log.i(TAG, "收到 MEDIA_PREVIOUS 广播") playPrevious()