未收到MEDIA_BUTTON回调

时间:2013-05-16 20:26:46

标签: android android-intent

我正在尝试创建一个应用程序,当通过音量键更改手机铃声音量时响应。我创建了一个注册BroadcastReceiver的服务,但onReceive没有被调用。

我在本论坛中看到了使用audioManager.registerMediaButtonEventReceiver并使用context.registerReceiver的示例。我的班级可以尝试其中任何一个,具体取决于useAudioManager的状态。无论哪种方式,该类正在注册,但onReceive永远不会被调用。

    public class VolumeKeyReceiver extends BroadcastReceiver
    {
      private static final boolean useAudioManager = true;

      @Override
      public void onReceive( Context context, Intent intent )
      {
        Log.d( "Monitor", "Volume key" );
      }

      public void register( Context context )
      {
        if ( useAudioManager )
        {
          AudioManager audioManager = (AudioManager)(context.getSystemService(Context.AUDIO_SERVICE));
          ComponentName componentName = new ComponentName( context, this.getClass() );
          audioManager.registerMediaButtonEventReceiver( componentName );
          Log.d( "Monitor", "registered via AudioManager" );
        }
        else
        {
          IntentFilter filter = new IntentFilter( Intent.ACTION_MEDIA_BUTTON );
          filter.setPriority( IntentFilter.SYSTEM_HIGH_PRIORITY );
          context.registerReceiver( this, filter );
          Log.d( "Monitor", "registered via Context" );
        }
      }
    }


    public class MonitorService extends Service
    {
      private VolumeKeyReceiver volumeKeyReceiver = null;
      @Override
      public void onCreate()
      {
        super.onCreate();
        volumeKeyReceiver = new VolumeKeyReceiver();
      }
      @Override
      public int onStartCommand(Intent intent, int flags, int startId)
      {
        volumeKeyReceiver.register( this );
        return START_STICKY;
      }
    }

    <receiver android:name=".VolumeKeyReceiver">
        <intent-filter>
      <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>

为简洁起见,我省略了onDestroy()unregister()

知道为什么我没有收到通知吗?我失踪的任何权限?我正在Galaxy S3上测试它。

3 个答案:

答案 0 :(得分:1)

您需要使用以下操作来收听音量控制

<action android:name="android.media.VOLUME_CHANGED_ACTION" />

答案 1 :(得分:0)

事实证明我使用了错误的回调。服务显然不会收到KeyEvent回调。相反,我应该使用ContentObserver。

以下链接显示了如何:Listen to volume buttons in background service?

答案 2 :(得分:0)

我遇到了同样的问题。对于这种情况,有许多错误的信息。 您只需接收蓝牙媒体按钮事件即可:

  1. 在AndroidManifest.xml中编写intent-filter部分

    <receiver
        android:name=".RemoteControlReceiver"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
    
  2. 不需要优先权。

    1. 实施RemoteControlReceiver类
    2. 调用registerMediaButtonEventReceiver(例如onCreate)

          AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
          receiverName = new ComponentName(this, RemoteControlReceiver.class);
          am.registerMediaButtonEventReceiver(receiverName);
      
    3. 安装apk后等待一段时间(手机约2分钟)。

    4. 这就是全部。 对于发展阶段,4是最重要的一点,但没有人提到。 您需要在注册接收器之前等待一段时间才能进入Android系统。 它需要比我更长的时间(我想大多数开发人员都希望)。

      我添加了一些注释:

      1. 您无需添加到AndroidManifest.xml以接收媒体按钮事件。
      2. 您不需要调用requestAudioFocus来接收此事件。
      3. 您不需要以编程方式调用注册意图过滤器。
      4. 您不需要设置优先级
      5. 安装adb后等几分钟。这是最重要的一点。