2012-11-06 25 views
11

लक्ष्य अंततः हेडसेट से प्रसारण, साथ ही ब्लूटूथ रोकना, मीडियाप्लेयर के परिवर्तन करने के लिए हेडसेट से प्राप्त क्लिक के विभिन्न प्रकार का जवाब है। यह समाधान आईसीएस से पहले सभी संस्करणों के लिए ठीक काम करता है।MediaButtonIntentReceiver एंड्रॉयड में काम नहीं कर 4.0+

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class)); 

मैं भी करने की कोशिश की:

.... 
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver(); 
.... 
public void onCreate() { 
    ... 
    IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
    mediaFilter.setPriority(2147483647); // this is bad...I know 
    this.registerReceiver(mediaButtonReceiver, mediaFilter); 
    ... 
} 

public class MediaButtonIntentReceiver extends BroadcastReceiver { 

    private KeyEvent event; 

    public MediaButtonIntentReceiver() { 
     super(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
      return; 
     } 
     event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null) { 
      return; 
     } 
     try { 
      int action = event.getAction(); 

      switch(action) { 

       case KeyEvent.ACTION_UP : 
        Log.d("TEST", "BUTTON UP"); 
        break; 
       case KeyEvent.ACTION_DOWN : 
       case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE : 
        Log.d("TEST", "BUTTON DOWN"); 
        break; 
      } 
     } catch (Exception e) { 
      Log.d("TEST", "THIS IS NOT GOOD"); 
     } 
     abortBroadcast(); 
    } 
} 

, यह काम करने के लिए प्रयास करने के लिए यह 4.0+ की तरह लगता है यह जो काम नहीं किया की तरह कुछ करने की आवश्यकता है: यहाँ कोड और चीजों को मैं कोशिश की है में से कुछ है इसे उपरोक्त के अलावा, मेनिफेस्ट में जोड़ें:

<receiver android:name=".MediaButtonIntentReceiver" android:enabled="true"> 
     <intent-filter android:priority="2147483647" > 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 

अभी भी कोई भाग्य नहीं है। मुझे यहां क्या समझ नहीं आ रहा है? यह निश्चित रूप से एक 4.0 +/आईसीएस/जेलीबीन मुद्दा है ... यह एक सेवा में किया जा रहा है, गतिविधि नहीं।

+0

मुझे एंड्रॉइड कोर में यह कारण भी मिला, लेकिन इसके आसपास होने का कोई समाधान नहीं: http://code.google.com/p/media-button-router/issues/detail?id=10#c4 – Du3

उत्तर

10

ऐसा लगता है कि अपने प्रसारण रिसीवर की तरह आपकी सेवा के लिए एक आंतरिक वर्ग है? इस यदि हां, तो अपने प्रसारण रिसीवर स्थिर बनाने के लिए और प्रकट में कार्य करें:

<receiver android:name="MyOuterClass$MediaButtonIntentReceiver" android:enabled="true"> 
    <intent-filter android:priority="2147483647" > 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

Android में 3.0+ आप रिसीवर रजिस्टर करने के लिए registerMediaButtonEventReceiver उपयोग करना चाहिए। यह IntentFilter के लिए AndroidManifest का उपयोग करता है। यह 2.x में काम करने का कारण है क्योंकि आप इसे this.registerReceiver() के साथ पंजीकृत कर रहे थे, जिसने AndroidManifest के बिना रिसीवर पंजीकृत किया था।

+3

एक आंतरिक वर्ग का उपयोग करने के लिए मेरे लिए एकमात्र औचित्य बाहरी वर्ग के तरीकों तक पहुंचने में सक्षम होना है, लेकिन यदि आंतरिक वर्ग स्थिर बना दिया गया है, तो मैं इन तरीकों तक पहुंच नहीं पाएगा। [22 पकड़ो] (http://stackoverflow.com/questions/15058743/how-do-i-register-in-manifest-an-inner-media-button-broadcastreciver#comment21174031_15058783)। सुझाव? – an00b

+0

@ an00b हम घटक के बीच संवाद करने के लिए एक आसान तरीका के रूप में Greenrobot's EventBus का उपयोग करते हैं (http://greenrobot.org/eventbus/documentation/)। जैसे स्थैतिक ब्रॉडकास्ट रिसीवर एक ऐसी घटना पोस्ट करता है जिस पर गतिविधि की सदस्यता लेती है। Decoupling के लिए बढ़िया –

1

बस इस पर जेली पर कोशिश मेरे लिए काम कर रहा है:

   broadcastReceiver = new BroadcastReceiver() {//global BroadcastReceiver 
      @Override 
      public void onReceive(Context context, Intent intent) { 

       String action = intent.getAction(); 
       if(action.equals("android.intent.action.MEDIA_BUTTON")){ 
        Log.e("test", "ok"); 
       } 
      }; 

आशय: Widgetsoid की मीडिया बटन (जो बीटी मीडिया बटन का अनुकरण) के साथ सेवा से

 IntentFilter intentfilterTime = null; 
     intentfilterTime = new IntentFilter(); 
     intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON"); 
     registerReceiver(broadcastReceiver, intentfilterTime); 

टेस्ट। सब काम कर रहे हैं।

+0

जब मैं मीडिया बटन दबाकर रखता हूं तो Google ऐप्स अभी भी इसे ले जाता है। मैंने इरादे को अधिकतम प्राथमिकता भी जोड़ा। मैंने ऑनक्रेट फ़ंक्शन में कोड का अपना स्निपिट जोड़ा। क्या इरादे के बारे में मैनिफेस्ट में परिभाषित करने के लिए मुझे कोई अन्य जगह परिभाषित करने की ज़रूरत है? जैसे मैंने कहा, यह प्री-4.0 एंड्रॉइड – Du3

+0

पर ठीक काम कर रहा है क्या आपने वास्तविक डिवाइस पर परीक्षण किया था? या एम्यूलेटर? मेरा कोड आपके लिए काम नहीं करता है? एंड्रॉइड 4.2 के साथ गैलेक्सी नेक्सस पर मेरे लिए काम करें। आम तौर पर इरादा प्रकट होता है या कोड में जैसे मैं आपको देता हूं लेकिन अन्य स्थान नहीं हैं। – jaumard

+0

4.1.1 के साथ गैलेक्सी एस 3 पर परीक्षण किया गया। मैंने उपर्युक्त सभी की कोशिश की है। 2.3.6 – Du3