Browse Source

上传语音关闭导航和音乐服务

newdev_shunjiawei
liwei1dao 1 year ago
parent
commit
d37d893d46
  1. 8
      local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/AmapServicePlugin.kt
  2. 37
      local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationActivity.kt
  3. 40
      local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationService.kt
  4. 53
      local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt
  5. 5
      local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt

8
local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/AmapServicePlugin.kt

@ -1,7 +1,13 @@
package com.yunqiinnovation.amap_service package com.yunqiinnovation.amap_service
import android.app.Activity import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context 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 com.amap.api.navi.AMapNaviView
import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel
@ -98,4 +104,6 @@ class AmapServicePlugin: FlutterPlugin, MethodCallHandler,EventChannel.StreamHan
} }
} }

37
local_plugins/amap_service/android/src/main/kotlin/com/yunqiinnovation/amap_service/NavigationActivity.kt

@ -1,6 +1,10 @@
package com.yunqiinnovation.amap_service package com.yunqiinnovation.amap_service
import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.appcompat.app.AppCompatActivity 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.AimLessModeStat
import com.amap.api.navi.model.NaviInfo import com.amap.api.navi.model.NaviInfo
import com.amap.api.navi.model.NaviLatLng import com.amap.api.navi.model.NaviLatLng
import com.yunqiinnovation.amap_service.NavigationService.Companion.sharedNavi
class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewListener { class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewListener {
private lateinit var naviView: AMapNaviView private lateinit var naviView: AMapNaviView
@ -32,6 +36,7 @@ class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewLi
private var startpos:String = ""; private var startpos:String = "";
private var endpos:String = ""; private var endpos:String = "";
private var ntype:String = ""; private var ntype:String = "";
private var isReceiverRegistered = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_navigation) setContentView(R.layout.activity_navigation)
@ -60,7 +65,31 @@ class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewLi
} }
navi?.addAMapNaviListener(this); 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() { override fun onResume() {
@ -80,6 +109,10 @@ class NavigationActivity : AppCompatActivity(), AMapNaviListener, AMapNaviViewLi
NavigationServiceHelper.startNavigation(context,"stop") NavigationServiceHelper.startNavigation(context,"stop")
naviView.onDestroy() naviView.onDestroy()
super.onDestroy() super.onDestroy()
if (isReceiverRegistered) {
unregisterReceiver(controlReceiver)
isReceiverRegistered = false
}
Log.i("NavigationActivity", "liwei------------------- onDestroy!") Log.i("NavigationActivity", "liwei------------------- onDestroy!")
} }

40
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.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.app.Service import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter
import android.graphics.Bitmap import android.graphics.Bitmap
import android.os.Build import android.os.Build
import android.os.IBinder import android.os.IBinder
@ -52,11 +54,24 @@ class NavigationService: Service(),AMapNaviListener {
fun isServiceRunning() = isRunning.get() fun isServiceRunning() = isRunning.get()
} }
private var isReceiverRegistered = false
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
instance = this instance = this
startForegroundNotification() 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 { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
@ -84,7 +99,17 @@ class NavigationService: Service(),AMapNaviListener {
} }
return START_STICKY 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() { private fun initializeAMapNavi() {
try { try {
sharedNavi = AMapNavi.getInstance(applicationContext).apply { sharedNavi = AMapNavi.getInstance(applicationContext).apply {
@ -399,4 +424,15 @@ class NavigationService: Service(),AMapNaviListener {
Log.e(TAG, "onGpsSignalWeak! $p0") Log.e(TAG, "onGpsSignalWeak! $p0")
// TODO("Not yet implemented") // TODO("Not yet implemented")
} }
override fun onDestroy() {
if (isReceiverRegistered) {
unregisterReceiver(controlReceiver)
isReceiverRegistered = false
}
stopForeground(true)
isRunning.set(false)
super.onDestroy()
}
} }

53
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) handler = MediaPauseHandler(context)
) )
// 注册媒体暂停功能
client.registerLocalFunction(
name = "media_close",
description = "关闭媒体播放",
parameters = mapOf(
"type" to "object",
"properties" to emptyMap<String, Any>(),
"required" to emptyList<String>()
),
handler = MediaCloseHandler(context)
)
// 注册媒体上一首功能 // 注册媒体上一首功能
client.registerLocalFunction( client.registerLocalFunction(
name = "media_previous", name = "media_previous",
@ -199,6 +209,32 @@ class SystemFunctionHandler(private val context: Context? = null) {
), ),
handler = OpenRecorderHandler(context) handler = OpenRecorderHandler(context)
) )
// 注册退出交互函数
client.registerLocalFunction(
name = "exit_navigation",
description = "结束当前导航服务",
parameters = mapOf(
"type" to "object",
"properties" to emptyMap<String, Any>(),
"required" to emptyList<String>()
),
handler = ExitNavigationHandler(context)
)
}
}
/**
* 退出导航服务
*/
private class ExitNavigationHandler(private val context: Context?) : FunctionHandler {
override suspend fun handle(arguments: Map<String, Any>): 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\": \"已暂停媒体播放\"}" return "{\"result\": \"已暂停媒体播放\"}"
} }
} }
/**
* 媒体暂停处理器
*/
private class MediaCloseHandler(private val context: Context?) : FunctionHandler {
override suspend fun handle(arguments: Map<String, Any>): 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\": \"已关闭媒体播放\"}"
}
}
/** /**
* 媒体上一首处理器 * 媒体上一首处理器
*/ */

5
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 { val filter = IntentFilter().apply {
addAction("com.yunqiinnovation.music_service.MEDIA_PLAY") addAction("com.yunqiinnovation.music_service.MEDIA_PLAY")
addAction("com.yunqiinnovation.music_service.MEDIA_PAUSE") 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_PREVIOUS")
addAction("com.yunqiinnovation.music_service.MEDIA_NEXT") addAction("com.yunqiinnovation.music_service.MEDIA_NEXT")
} }
@ -132,6 +133,10 @@ class MusicService : MediaBrowserServiceCompat() {
Log.i(TAG, "收到 MEDIA_PLAY 广播") Log.i(TAG, "收到 MEDIA_PLAY 广播")
resume() resume()
} }
"com.yunqiinnovation.music_service.MEDIA_CLOSE" -> {
Log.i(TAG, "收到 MEDIA_CLOSE 广播")
stopSelf()
}
"com.yunqiinnovation.music_service.MEDIA_PREVIOUS" -> { "com.yunqiinnovation.music_service.MEDIA_PREVIOUS" -> {
Log.i(TAG, "收到 MEDIA_PREVIOUS 广播") Log.i(TAG, "收到 MEDIA_PREVIOUS 广播")
playPrevious() playPrevious()

Loading…
Cancel
Save