在Android锁屏上处理音量变化?

问题描述:

我想要做的是,能够在android 4.4上的锁屏上捕捉音量上/下按钮操作。在Android锁屏上处理音量变化?

Google Cast Design Checklist文档描述了锁屏要求“通过硬件按钮提供对音量控制的访问”。我尝试了各种方式来处理锁定屏幕上的硬件音量按钮,但没有一个能够工作。

  1. 的onkeydown/dispatchKeyEvent - 我试图重写的onkeydown以及对活动dispatchKeyEvent方法,但这些都不是在锁屏执行,当我的应用程序的重点是这些才能工作。

  2. Settings.System.CONTENT_URI/ContentObserver - 对主要活动内容解析器注册内容观察者看搭上系统设置改变,但也不会在锁定画面出现。

  3. android.intent.action.MEDIA_BUTTON - 具有明显的此过滤器,我能够接收播放/暂停从锁屏但是没有体积变化事件的行动。

  4. android.media.VOLUME_CHANGED_ACTION - 具有明显的此过滤器,当接收到在我的BroadcastReceiver这种情况下,遗憾的是其额外的价值永远不会在锁屏改变。当我继续点击音量按钮时,即使广播接收器接收到CHANGED动作,返回的android.media.EXTRA_VOLUME_STREAM_VALUE也保持不变(即始终为1)。

  5. CastVideos-机器人 - 参考Android的应用程序发送者似乎能够从发件人controling即使以控制接收器音量锁屏,但是,即使把breakpoitns遍布各地Cast.CastApi.setVolume的地方后() ,这些不会被挑选出来。所以看起来这个命令正在从我找不到的地方发送到接收器。

我还可以看到一些其他的应用程序能够赶上HW音量键即播放音乐应用。所以我的设备肯定是有能力的...

任何人都可以提出任何工作解决方案?

+1

对于CastVideos-的Android,它在CastCompanionLibrary真实处理涉及。我相信[VideoCastManager](https://github.com/googlecast/CastCompanionLibrary-android/blob/master/src/com/google/android/libraries/cast/companionlibrary/cast/VideoCastManager.java)。 – Andy 2015-04-06 16:55:20

在最后它似乎我缺少一行代码:

MediaRouter.getInstance(context).addRemoteControlClient(remoteControlClient); 

MediaRouter.getInstance(activity).setMediaSession(session.getMediaSession()); 

这里是从我实现更多的代码为4.0+:

import android.media.AudioManager; 
import android.media.RemoteControlClient; 
import android.support.v7.media.MediaRouter; 

remoteControlClient = new RemoteControlClient(pendingIntent); 
remoteControlClient.setTransportControlFlags(RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE); 

audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
audioManager.registerMediaButtonEventReceiver(receiver); 
audioManager.registerRemoteControlClient(remoteControlClient); 

MediaRouter.getInstance(context).addRemoteControlClient(remoteControlClient); 

和5。0+:

import android.media.AudioManager; 
import android.support.v4.media.session.MediaSessionCompat; 
import android.support.v7.media.MediaRouter; 

session = new MediaSessionCompat(activity, TAG); 
session.setPlaybackToLocal(AudioManager.STREAM_MUSIC); 

MediaRouter.getInstance(activity).setMediaSession(session.getMediaSession()); 

有趣的是,有一些黑魔法在内部控制接收器的体积和自己Cast.CastApi.setVolume()呼叫没有在所有

您或者需要使用最近推出的RemoteControlClient(在预棒棒糖上)或MediaSession。例如,请看CastCompanionLibrary, VideoCastManager#setUpRemoteControl()方法,其中RCC使用MediaRouter注册。如果使用MediaSession,则需要使用MediaRouter注册MediaSession。

+0

感谢您指出我正确的方向,我需要调用'mediaRouter.addRemoteControlClient()'确实 – Yoz 2015-04-07 07:52:34