2013-05-16 74 views
1

我正嘗試創建一個應用程序,該應用程序在通過音量鍵更改電話鈴聲音量時作出響應。我創建了一個註冊BroadcastReceiver的服務,但onReceive沒有被調用。未收到MEDIA_BUTTON回撥

我在本論壇中看到過使用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

原來我使用了錯誤的回調。服務顯然不會收到KeyEvent回調。相反,我應該使用ContentObserver。

以下鏈接說明了如何:Listen to volume buttons in background service?

+0

只有這也不起作用。而不是音量鍵,而不是在屏幕關閉時(或音量實際上沒有改變)。 – Michael

1

你需要下面用行動來聽音量控制

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

這對於捕獲實際的音量按鍵非常有用。例如,如果顯示屏關閉,音量不會改變,並且'VOLUME_CHANGED_ACTION'意圖不會觸發。 – Michael

0

我打的是同樣的問題。這種情況有很多錯誤的信息。 所有你需要接收藍牙媒體按鈕事件是:需要在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. 寫意圖濾波部。

  2. 實施RemoteControlReceiver類
  3. 呼叫registerMediaButtonEventReceiver(在的onCreate,例如)

    AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE); 
        receiverName = new ComponentName(this, RemoteControlReceiver.class); 
        am.registerMediaButtonEventReceiver(receiverName); 
    
  4. 等待一段時間(我的電話大約2分鐘)後安裝APK。

就這樣。 對於開發階段,4是最重要的一點,但沒有人提到。 您需要等待註冊接收機到Android系統之前的某個時間。 比我想象的要長(我猜大部分開發人員)。

我補充一些注意事項:

  1. 你並不需要添加到AndroidManifest.xml中用於接收媒體鍵事件。
  2. 您不需要調用requestAudioFocus來接收此事件。
  3. 您不需要以編程方式調用註冊意圖過濾器。
  4. 你並不需要設置優先級

等待幾分鐘ADB安裝後。這是最重要的一點。

相關問題