在Android锁屏上处理音量变化?
我想要做的是,能够在android 4.4上的锁屏上捕捉音量上/下按钮操作。在Android锁屏上处理音量变化?
Google Cast Design Checklist文档描述了锁屏要求“通过硬件按钮提供对音量控制的访问”。我尝试了各种方式来处理锁定屏幕上的硬件音量按钮,但没有一个能够工作。
的onkeydown/dispatchKeyEvent - 我试图重写的onkeydown以及对活动dispatchKeyEvent方法,但这些都不是在锁屏执行,当我的应用程序的重点是这些才能工作。
Settings.System.CONTENT_URI/ContentObserver - 对主要活动内容解析器注册内容观察者看搭上系统设置改变,但也不会在锁定画面出现。
android.intent.action.MEDIA_BUTTON - 具有明显的此过滤器,我能够接收播放/暂停从锁屏但是没有体积变化事件的行动。
android.media.VOLUME_CHANGED_ACTION - 具有明显的此过滤器,当接收到在我的BroadcastReceiver这种情况下,遗憾的是其额外的价值永远不会在锁屏改变。当我继续点击音量按钮时,即使广播接收器接收到CHANGED动作,返回的android.media.EXTRA_VOLUME_STREAM_VALUE也保持不变(即始终为1)。
CastVideos-机器人 - 参考Android的应用程序发送者似乎能够从发件人controling即使以控制接收器音量锁屏,但是,即使把breakpoitns遍布各地Cast.CastApi.setVolume的地方后() ,这些不会被挑选出来。所以看起来这个命令正在从我找不到的地方发送到接收器。
我还可以看到一些其他的应用程序能够赶上HW音量键即播放音乐应用。所以我的设备肯定是有能力的...
任何人都可以提出任何工作解决方案?
在最后它似乎我缺少一行代码:
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。
感谢您指出我正确的方向,我需要调用'mediaRouter.addRemoteControlClient()'确实 – Yoz 2015-04-07 07:52:34
对于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