1

我正在尝试创建一个应用程序,当通过音量键更改电话铃声音量时做出响应。我创建了一个注册 a 的服务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 上测试它。

4

3 回答 3

1

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

<action android:name="android.media.VOLUME_CHANGED_ACTION" />
于 2013-07-16T19:42:14.260 回答
0

我遇到了同样的问题。而且这个案子有很多错误的信息。您需要接收蓝牙媒体按钮事件是:

  1. 在 AndroidManifest.xml 中编写意图过滤器部分

    <receiver
        android:name=".RemoteControlReceiver"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
    

不需要优先级。

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

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

就这样。对于开发阶段,4是最重要的一点,但没有人提到。您需要等待一段时间才能将接收器注册到 Android 系统。它花费的时间比我(我猜大多数开发人员)预期的要长。

我添加一些注释:

  1. 您无需添加到 AndroidManifest.xml 即可接收媒体按钮事件。
  2. 您无需调用 requestAudioFocus 即可接收此事件。
  3. 您不需要以编程方式调用注册意图过滤器。
  4. 您无需设置优先级

adb 安装后等待几分钟。这是最重要的一点。

于 2015-01-13T17:07:24.923 回答
0

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

以下链接显示了如何:在后台服务中收听音量按钮?

于 2013-05-29T18:24:35.903 回答