I'm trying to create an application that responds when the phone ringer volume is changed via the Volume Key. I've created a Service that registers a BroadcastReceiver, but the onReceive is not getting called.
I've seen examples in this forum of using audioManager.registerMediaButtonEventReceiver and also using context.registerReceiver. My class can try either of them depending on the state of useAudioManager. Either way, the class is being registered, but onReceive never gets called.
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>
I've omitted onDestroy() and unregister() for brevity.
Any idea why I'm not getting the notifications? Any permissions I'm missing? I'm testing it on a Galaxy S3.