2011-09-20 18 views
5

मैंने एंड्रॉइडमैनीफेस्ट.एक्सएमएल में ब्रॉडकास्ट रिसीवर (एक्शन_हेडसेट_प्लग) घोषित किया और ब्रॉडकास्टैंडर क्लास को ब्रॉडकास्ट रिसीवर को कार्यान्वित किया। मैं डिवाइस पर एपीके चलाता हूं और रिसीवर आग नहीं लगाता है। हालांकि, जब मैं गतिविधि में रजिस्टर रिसीवर() का उपयोग करता हूं तो यह सही तरीके से काम करता है। क्या मुझे AndroidManifest.xml में कुछ याद आती है?[एंड्रॉइड] ब्रॉडकास्ट रिसीवर (एक्शन_हेडसेट_प्लग) फायरिंग

यह AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="irdc.Earphone_test" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="9" /> 
<uses-permission android:name="android.permission.ACTION_HEADSET_PLUG"></uses-permission> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <receiver android:enabled="true" android:name="BroadcastHandler"> 
      <intent-filter> 
       <action android:name="android.intent.ACTION_HEADSET_PLUG"></action> 
      </intent-filter> 
     </receiver> 
     <activity android:name=".Earphone_testActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

है यह रिसीवर कोड

public class BroadcastHandler extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) {  

     if(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)){      
      String mes; 
      int state = intent.getIntExtra("state", 4); 
      if(state == 0){  
       mes ="out"; 
      }else if(state == 1){  
       mes ="in";   
      }else {   
       mes ="others"; 
      } 
      AlertDialog.Builder builder = new AlertDialog.Builder(context);   
      builder.setTitle("Headset broadcast");  
      builder.setMessage(mes);  
      builder.setPositiveButton("Okey-dokey", new DialogInterface.OnClickListener() {  
       public void onClick(DialogInterface dialog, int which) {    
        dialog.dismiss();   
       }  
      });  
      builder.create().show(); 

     } 

    } 
} 
+0

ACTION_HEADSET_PLUG नहीं है android.permission – shim

उत्तर

1

नाम प्रकट प्रविष्टि में गलत है। पूर्ण पैकेज का नाम प्रयोग करें, या अवधि के साथ इसे शुरू अगर आप चाहते हैं यह परोक्ष ऐप का पैकेज नाम के साथ जोड़ दिया:

<receiver android:enabled="true" android:name=".BroadcastHandler"> 
0

रिसीवर के अधिकांश उदाहरण एक AlertDialog लेकिन टोस्ट संदेश शुरू नहीं करते हैं या एक बनाने स्टेटस बार में अधिसूचना। मुझे यकीन है कि आप एक गतिविधि शुरू नहीं कर सकते क्योंकि "सामग्री" ऑब्जेक्ट मौजूदा बंद हो जाती है लेकिन यदि आप एक अलर्टडिअलॉग बना सकते हैं। (documentation of Broadcasts)

तो आप यह सुनिश्चित करने के लिए अपने रिसीवर को टोस्ट संदेश पर आज़मा सकते हैं कि यह काम करता है। अधिसूचना के साथ

उदाहरण: http://www.anddev.org/recognize-react_on_incoming_sms-t295.html

+0

के विकल्पों में से एक के रूप में दिखाएं ["आपकी त्रुटि के संबंध में, एक मैनिफेस्ट-पंजीकृत ब्रॉडकास्ट रिसीवर एक गतिविधि नहीं है, और इसलिए यह एक संवाद नहीं बना सकता है।"] (http://stackoverflow.com/questions/3432601/alertdialog-in-broadcastreceiver/3432645 # 3432645) – madlymad

5

परिवर्तन हेडसेट से सुनने के लिए, प्रसारण रिसीवर प्रकट में घोषित नहीं किया जा सकता, यह गतिशील पंजीकृत होना चाहिए। मैनिफेस्ट में घोषित होने पर सभी रिसीवर काम नहीं करते हैं और यह एक ऐसा उदाहरण है जहां आपको इसे प्रोग्रामेटिक रूप से पंजीकृत करने की आवश्यकता होती है।

आप एक गतिविधि के onResume विधि में या एक सेवा के onCreate विधि में उदाहरण के लिए इस कॉल कर सकते हैं: फिर गतिविधि के onPause विधि में या सेवा के OnDestroy विधि में

headsetReceiver = new BroadcastHandler(); 
registerReceiver(headsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 

आप रिसीवर को अनधिकृत करने की आवश्यकता:

unregisterReceiver(headsetReceiver); 
+1

यह एक दूसरे से अलग क्यों है? क्या आपके पास दस्तावेज़ीकरण का एक लिंक है जो इसकी पुष्टि करता है? – shim

+0

http://developer.android.com/reference/android/content/Intent.html उन लोगों के लिए एक नोट बनाता है जिन्हें ऐप मेनिफेस्ट के माध्यम से पंजीकृत नहीं किया जा सकता है, और यह उनमें से एक नहीं है। – shim

+0

हालांकि, मैं इसे इस विधि के साथ काम करने में सक्षम था। धन्यवाद! – shim

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