Android RegisterMediaButtonVentreceiver未接收事件
我正在尝试接收物理按钮事件,如手机侧面的音量按钮点击。我需要在服务中这样做,因为如果用户在任何时候单击音量上升/下降按钮,我希望接收。 我在网上读了很多书,但我不能让它工作,也不知道会出什么问题。这是我的代码: 在舱单中:Android RegisterMediaButtonVentreceiver未接收事件,android,volume,Android,Volume,我正在尝试接收物理按钮事件,如手机侧面的音量按钮点击。我需要在服务中这样做,因为如果用户在任何时候单击音量上升/下降按钮,我希望接收。 我在网上读了很多书,但我不能让它工作,也不知道会出什么问题。这是我的代码: 在舱单中: <receiver android:name=".clsMediaButtonReceiver" > <intent-filter android:priority="1000" > <action
<receiver android:name=".clsMediaButtonReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<receiver android:name="net.mypackage.MyClass.MediaButtonReceiver">
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
Broascastereceiver的一个例子:
public class clsMediaButtonReceiver extends BroadcastReceiver
{
@Override public void onReceive(Context context, Intent intent)
{ //This is never shown
Toast toast1 = Toast.makeText(Context, intent.getAction(), Toast.LENGTH_SHORT);
toast1.show();
}
}
我和你有同样的问题,我想知道你是否解决了。与我的代码不同的是,我将broadcastReceiver类放在另一个类中。诸如此类:
public class MyClass extends Activity
{
/// Code
public class MediaButtonReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
/// Code
}
}
}
以及舱单:
<receiver android:name=".clsMediaButtonReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<receiver android:name="net.mypackage.MyClass.MediaButtonReceiver">
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
感谢您的帮助我将
添加到我的意图过滤器中,现在我获得了卷键事件。我还没有弄清楚如何在我的应用程序中正确分发它们。。。
希望有帮助 我知道这是一个老问题,我遇到了同样的问题,发现只有在持有AudioManager.AUDIOFOCUS\u增益后才能注册registerMediaButtonEventReceiver(..),否则它就无法工作 我试着用@Ton写的相同清单和广播接收者
private class ClassOnAudioFocusChangeListener implements AudioManager.OnAudioFocusChangeListener {
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
Log.e("ClassOnAudioFocusChangeListener: ", "AUDIOFOCUS_LOSS_TRANSIENT");
}
else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
Log.e("ClassOnAudioFocusChangeListener: ", "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
}
else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
Log.e("ClassOnAudioFocusChangeListener: ", "AUDIOFOCUS_GAIN");
mAudioManager.registerMediaButtonEventReceiver(mMediaButtonEventComponenName);
}
else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
Log.e("ClassOnAudioFocusChangeListener: ", "AUDIOFOCUS_LOSS");
}
}
};
这是同样的清单
<receiver
android:name="MainActivity$MediaButtonEventReceiver">
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
我的代码现在可以正常工作了!我有一个音量滑块,想要听音乐音量的变化。我注册了一个问题中类似的接收者(加上我回答中的动作),然后使用侦听器模式广播来自该接收者的事件。经过一段时间的研究,我意识到在接收到一个事件之前,接收者是不会被实例化的。我绕过了这个问题,保留了一个侦听器的静态列表,其他组件可以注册到该列表中,接收器将使用该列表来广播事件。避免静态引用。您可能很容易泄漏资源。对于广播接收器和服务之间的通信,请在服务中实现onBind,并在广播接收器的onReceive中调用peek服务。我会向您展示代码,但它太长了,无法发表评论。@Hi Ton,哪个android版本允许您使用registerDiaButtoneVentreceiver()?实际上,我想在我的应用程序中使用它,但它不是编译。AudioManager中似乎没有这种方法。您可以plz回复吗?您不能在Android清单中将非静态内部类指定为BroadcastReceiver。请在Android L+上查看您的建议是否有效,但取消注册则无效。我一直在关注这些事件。让清单中声明了完整意图筛选器和操作的接收方静态注册它,您就不能再注销它了。解决方案:在清单中只定义接收者,而不定义意图过滤器。然后可以在代码中动态注册和注销它。