我正在尝试创建一个应用程序,当通过音量键更改手机铃声音量时响应。我创建了一个注册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上测试它。
答案 0 :(得分:1)
您需要使用以下操作来收听音量控制
<action android:name="android.media.VOLUME_CHANGED_ACTION" />
答案 1 :(得分:0)
事实证明我使用了错误的回调。服务显然不会收到KeyEvent回调。相反,我应该使用ContentObserver。
答案 2 :(得分:0)
我遇到了同样的问题。对于这种情况,有许多错误的信息。 您只需接收蓝牙媒体按钮事件即可:
在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>
不需要优先权。
调用registerMediaButtonEventReceiver(例如onCreate)
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
receiverName = new ComponentName(this, RemoteControlReceiver.class);
am.registerMediaButtonEventReceiver(receiverName);
安装apk后等待一段时间(手机约2分钟)。
这就是全部。 对于发展阶段,4是最重要的一点,但没有人提到。 您需要在注册接收器之前等待一段时间才能进入Android系统。 它需要比我更长的时间(我想大多数开发人员都希望)。
我添加了一些注释:
安装adb后等几分钟。这是最重要的一点。