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+上查看您的建议是否有效,但取消注册则无效。我一直在关注这些事件。让清单中声明了完整意图筛选器和操作的接收方静态注册它,您就不能再注销它了。解决方案:在清单中只定义接收者,而不定义意图过滤器。然后可以在代码中动态注册和注销它。