使用BLE连接的智能手表和智能手环如何控制Android手机中的音乐播放?

问题描述 投票:0回答:1

我正在尝试实现两个示例 BLE 应用程序。一个应用程序将是客户端应用程序,另一个应用程序将是两个不同设备中的外围应用程序。客户端应用程序将对可用的 BLE 设备进行 BLE 扫描,并将连接到 BLE 外围应用程序,该应用程序将启动 GattServer。这两个应用程序的主要目的是从任何媒体播放应用程序控制客户端应用程序设备中发生的媒体播放。每当客户端应用程序设备中的媒体播放状态发生变化或每当用户尝试从外围应用程序更改媒体播放状态时,我都为客户端应用程序和外围应用程序之间的通信定义了自定义 BLE 服务和特征。我利用通知功能和特征写入功能来实现客户端应用程序和外围应用程序之间的双向通信。到目前为止,客户端应用程序和外围应用程序之间的通信工作正常。

我尝试使用 MediaSessionManager API 来获取媒体播放时媒体应用程序使用的媒体会话的详细信息。但是为了使用这个API,我们必须在android清单文件中定义权限。由于此权限是系统应用程序权限,因此我将无法生成 apk 来在我的手机中进行测试。这让我想知道这些 BLE 智能手环如何能够控制所连接的 Android 手机中发生的媒体播放,而无需在相应的 Android 手机上安装系统应用程序。是否还有其他我不知道的 API 可以帮助我了解手机中发生的媒体播放控制的用例?

android bluetooth-lowenergy wear-os sony-smartwatch android-mediasession
1个回答
0
投票

我找到了解决方案。为了在没有系统应用程序权限的情况下针对此用例使用 MediaSession 管理器 API,我们需要创建一个通知侦听器,并且必须传递它以获取媒体会话详细信息,而不会引发系统应用程序权限错误:

val mediaSessionManager = getSystemService(MEDIA_SESSION_SERVICE) as MediaSessionManager
    val listenerComponent =
        ComponentName(this, NotificationListener::class.java);

    var mSessionsChangedListener: MediaSessionManager.OnActiveSessionsChangedListener =
        MediaSessionManager.OnActiveSessionsChangedListener {
            Log.e("MainActivity", "Total controller ${it?.size}")
        }

    mediaSessionManager.addOnActiveSessionsChangedListener(
        mSessionsChangedListener,
        listenerComponent
    )

    val sessions = mediaSessionManager.getActiveSessions(listenerComponent)

上面的代码可以正常工作,不会抛出错误。

NotificationListener.kt 可以按如下方式创建:

public class NotificationListener : NotificationListenerService() {
     fun isEnabled(context: Context): Boolean {
        return NotificationManagerCompat
            .getEnabledListenerPackages(context)
            .contains(context.packageName)
    }
}

这样我们的应用程序将能够侦听另一个媒体应用程序中发生的媒体播放状态变化,并且还可以了解元数据并控制我们的应用程序的播放。

© www.soinside.com 2019 - 2024. All rights reserved.