这是处理 Android 上我的实际 MediaPlayerService 类的 MediaSession 的代码部分(API 级别 30):
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
mediaSession = new MediaSessionCompat(this, TAG);
mediaSession.setCallback(new MediaSessionCallback());
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
playbackStateBuilder = new PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY |
PlaybackStateCompat.ACTION_PAUSE |
PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS |
PlaybackStateCompat.ACTION_SKIP_TO_NEXT);
mediaSession.setPlaybackState(playbackStateBuilder.build());
mediaSession.setActive(true);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
}
if (mediaSession != null) {
mediaSession.release();
}
}
private class MediaSessionCallback extends MediaSessionCompat.Callback {
@Override
public void onPlay() {
super.onPlay();
play();
}
@Override
public void onPause() {
super.onPause();
pause();
}
@Override
public void onSkipToNext() {
super.onSkipToNext();
playSong(1);
}
@Override
public void onSkipToPrevious() {
super.onSkipToPrevious();
playSong(-1);
}
}
基本上,它是一个音乐播放器,一旦通过蓝牙连接,就会从我的汽车接收命令(播放下一个、上一个,等等)。
我想做的是拦截我的车载显示屏的触摸(可以这么说,其中显示歌曲/艺术家信息)。
有些人认为“触摸 -> 触发我的应用程序上的方法”。
我怎样才能实现这个目标?是否可以?谢谢
考虑到当前的 Android API 和汽车信息娱乐系统的标准实践,直接从汽车显示屏拦截触摸事件来控制 Android 应用程序似乎并不可行。
Android 的输入事件系统 旨在处理来自直接连接或与设备集成的设备(例如设备的触摸屏、物理按钮、传感器)的触摸、按键和其他输入事件。
外部显示器,尤其是那些未明确设计用于 Android 输入系统的显示器,不会以 Android 应用程序可以拦截的方式直接将触摸事件发送到连接的 Android 设备。
大多数车载显示器独立于连接的设备运行。当您将 Android 设备连接到汽车的信息娱乐系统(通过蓝牙、USB 或其他)时,连接通常仅限于特定协议(例如,用于音频流、呼叫处理或显示元数据)。这些协议不包括将触摸事件从汽车显示屏转发到连接的 Android 设备的标准。
此外,允许外部设备直接将输入事件注入 Android 设备将引发重大的安全和隐私问题。这将使恶意设备更容易模仿用户输入,从而可能导致未经授权的操作。