2012-04-16 15 views
16

काम नहीं कर रहा है मैं एंड्रॉइड ओएस के संस्करण 4.0.3 (आईसीएस) के लिए एक एंड्रॉइड एप्लिकेशन लिख रहा हूं। मुद्दा यह है कि मुझे ब्रॉडकास्ट रिसीवर की ऑनसेसिव() विधि में मेरे Log.d() से आउटपुट नहीं मिल रहा है जिसका अर्थ है कि मेरा एप्लिकेशन प्रसारण को सही ढंग से प्रबंधित नहीं कर रहा है।ACTION_MEDIA_BUTTON के लिए ब्रॉडकास्ट रिसीवर

मैंने क्लिक किए गए ACTION_MEDIA_BUTTON पर कोड चलाने के तरीके के बारे में अनगिनत प्रश्न पढ़े हैं। जब मैंने काम नहीं किया है, तो मैंने यह भी देखने के लिए + चिपकाया कोड कॉपी किया है, यह देखने के लिए कि यह काम करेगा या नहीं।

ACTION_MEDIA_BUTTON मैं संभालना चाहता हूं एकल इयरफ़ोन पर बटन जो उपयोगकर्ता को पिकअप/कॉल कॉल करने, संगीत चलाने/रोकने की अनुमति देता है। इस बटन को संभालने के मेरे आवेदन के बजाय, जब मैं इसे क्लिक करता हूं, तो मेरे नेक्सस एस एंड्रॉइड पर स्टॉक म्यूजिक प्लेयर गाने चलाता है।

मैंने अपना कोड किसी अन्य वर्ग में नहीं रखा है, शायद यही कारण है कि यह काम नहीं कर रहा है?

IntentFilter mediaButtonFilter = new IntentFilter(
      Intent.ACTION_MEDIA_BUTTON); 
    mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 
    BroadcastReceiver brMediaButton = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      Log.d("Event", "Media button!"); 
      this.abortBroadcast(); 

      KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
      if(key.getAction() == KeyEvent.ACTION_UP) { 
       int keycode = key.getKeyCode(); 
       if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) { 
        Log.d("TestApp", "Next Pressed"); 
       } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { 
        Log.d("TestApp", "Previous pressed"); 
       } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) { 
        Log.d("TestApp", "Head Set Hook pressed"); 
       } 
      } 

     } 
    }; 
    registerReceiver(brMediaButton, mediaButtonFilter); 

सभी मैं वास्तव में के लिए परीक्षण की आवश्यकता है:

यहाँ कोड विधि OnCreate() पर पाया है (इस विशिष्ट कोड मैं एक वेबसाइट के बाद कोड मैंने लिखा काम नहीं किया बंद की नकल की) KEYCODE_HEADSETHOOK लेकिन परीक्षण के लिए अन्य कोड रखने में कोई दिक्कत नहीं होती है, मैं इसे ठीक कर दूंगा जब मैं सब कुछ ठीक से काम कर सकता हूं।

मेरी प्रकट में:

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

मैं मूल रूप से सोचा था कि इस के बाद से मैं इस बात के लिए कोई भी अनुमतियां निर्दिष्ट नहीं किया है लेकिन मैं किसी भी त्रुटि संदेश प्राप्त नहीं किया था एक अनुमतियाँ मुद्दा हो सकता है।

जैसा कि मैंने पहले कहा था, मैंने इसके कई बदलावों की कोशिश की है। कॉमन्सवेयर के सुधारों के साथ इस लिंक broadcastreceiver onReceive problem ACTION_MEDIA_BUTTON Android पर कोड का उपयोग था। फिर भी, मैंने इसे संशोधित किया ताकि यह एक अलग वर्ग में न हो।

आपकी मदद के लिए अग्रिम धन्यवाद।

+0

कृपया जांचें [यह] (http://stackoverflow.com/questions/3369554/how-to-handle-long-press-media-button-in-order-to लगभग -launch-गतिविधि) और [इस] (http://stackoverflow.com/questions/6603170/broadcastreceiver-onreceive-problem-action-media-button-android) आशा इससे आपकी समस्या का समाधान होगा – silwar

+0

मेरे पास है आपके जैसा ही कोड और यह एंड्रॉइड 2.2/2.3 पर ठीक काम कर रहा है। लेकिन आप की तरह मैं इसे आईसीएस के साथ काम नहीं कर सकता ... – user1026605

+0

वही है। यह एंड्रॉइड 4.0 से पहले काम करता है। एपीआई बदल गया या कुछ। – joepetrakovich

उत्तर

8

मैं एंड्रॉयड 4.4.2 के साथ एक Samsung Galaxy S5 पर इस परीक्षण किया गया। तो क्या महत्वपूर्ण है और क्या अन्य पदों में उल्लेख नहीं किया गया है:

  • AndroidManifest.xml में रिसीवर रजिस्टर आवेदन टैग के अंदर लेकिन बाहर हर गतिविधि टैग से।
  • आपका रिसीवर Broadcastreceiver होने की जरूरत सार्वजनिक और स्थिर
  • एक गतिविधि बटन प्रेस

ठीक है और यहाँ कुछ उदाहरण कोड के लिए सुनने के लिए एक MediaButtonEventReceiver रजिस्टर करने की आवश्यकता:

mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class); 
... 
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); 
... 
// somewhere else 
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent); 

यहां रिसीवर:

public static class YourBroadcastReceiver extends BroadcastReceiver{ 

    // Constructor is mandatory 
    public MediaBroadcastReceiver() 
    { 
     super(); 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     Log.i (TAG_MEDIA, intentAction.toString() + " happended"); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
      Log.i (TAG_MEDIA, "no media button information"); 
      return; 
     } 
     KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null) { 
      Log.i (TAG_MEDIA, "no keypress"); 
      return; 
     } 
     // other stuff you want to do 
    } 
} 

और यहाँ प्रकट टुकड़ा। आशय फिल्टर के लिए ऐड प्राथमिकता की जरूरत है, लेकिन मेरे लिए की जरूरत नहीं किया गया था:

<application> 
    <receiver android:name="OuterClass$YourBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
    </receiver> 
    <activity> ... </activity> 
</application> 

संदर्भ के लिए:

+0

पंजीकृत किया है, मैं सैमसंग डिवाइस में इसे लागू करने की कोशिश कर रहा हूं, जब मेरी गतिविधि पृष्ठभूमि में जा रही है() हमेशा कॉल करें लेकिन नेक्सस ऑन रीसीव() को कभी भी पृष्ठभूमि में नहीं बुलाया जाता है। क्या आप बस समझा सकते हैं क्यों? –

4
mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()); 

mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

mAudioManager.registerMediaButtonEventReceiver(mediaButatonReceiver); 

यह कोड अपने एप्लिकेशन और अपने अनुप्रयोग के लिए अपने हेड फोन्स बटन बाध्य होगा केवल जब तक आप फोन:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButatonReceiver); 
+3

या जब तक अन्य ऐप कॉल नहीं करता है तो रजिस्टर मीडिया-बटनऑवेंट रिसीवर() ', मैं रास्ता चाहूंगा;) – cprcrack

+0

जहां मैं प्रसारण पंजीकृत कर सकता हूं। मैंने रिसीवर को मैनिफेस्ट फ़ाइल में केवल –

0

आप एंड्रॉइड> 5.0 (एपीआई स्तर के लिए ब्रोकास्ट्रेसीवर का उपयोग करने से बच सकते हैं 21 लॉलीपॉप) यहां वर्णित मीडिया सत्र का उपयोग करके: https://stackoverflow.com/a/39413753/1386969

संबंधित मुद्दे