2012-07-03 2 views
8

पर वॉल्यूम परिवर्तन की घटनाओं को सुनें क्या एंड्रॉइड पर वॉल्यूम परिवर्तन की घटना को सुनने के लिए कोई तरीका है, बिना वॉल्यूम बटन लेते हुए?एंड्रॉइड

एकमात्र चीज़ जो मैंने पाया है वह काम करता है here है, लेकिन वॉल्यूम नियंत्रण गायब होने के बाद ही यह काम करता है।

सभी उपकरणों में वॉल्यूम बटन नहीं हैं, और जैसे ही वे होते हैं, वॉल्यूम परिवर्तनों को कैप्चर करने की आवश्यकता होती है, और वॉल्यूम संवाद समाप्त होने के बाद नहीं।

+0

ContentObserver का उपयोग करें और ऑडीमेनगर से वॉल्यूम प्राप्त करें। मैंने हाल ही में इसका इस्तेमाल किया और यह बहुत अच्छा काम करता है। [इस समाधान को स्टैक ओवरफ्लो में देखें] (http://stackoverflow.com/questions/6896746/android-is-there-a-broadcast-action-for-volume-changes) – user2503849

+0

यह ' एक पुरानी पोस्ट है, लेकिन यह कमजोर है कि अब तक एंड्रॉइड में ब्रॉडकैट लागू नहीं किया गया है .... 5 साल बाद, अभी भी कोई प्रसारण नहीं ... – Opiatefuchs

+1

@Opiatefuchs शायद इसके लिए एक अनुरोध बनाएं, https://issuetracker.google.com/issues। मैं इसे तारांकित करूंगा :) –

उत्तर

0

आप उपयोग कर सकते हैं: registerMediaButtonEventReceiver (ComponentName eventReceiver) जो एक घटक पंजीकृत करता MEDIA_BUTTON उद्देश्य के एकमात्र रिसीवर किया जाना है।

// in your activity. 
MediaButtonReceiver receiver = new MediaButtonReceiver(); 

// in onCreate put 
registerMediaButtonEventReceiver(receiver); 

class MediaButtonReceiver implements BroadcastReceiver { 
    void onReceive(Intent intent) { 
      KeyEvent ke = (KeyEvent)intent.getExtra(Intent.EXTRA_KEY_EVENT); 
      if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { 
      //action when volume goes down 
      } 
      if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) { 
       //action when volume goes up 
      } 
    } 
} 

    //In both onStop and onPause put : 
    unregisterMediaButtonEventReceiver(receiver); 

हम यहाँ क्या कर रहे हैं एक BroadcastReceiver कि ACTION_MEDIA_BUTTON के साथ सौदों को परिभाषित किया गया है। और EXTRA_KEY_EVENT का उपयोग करें जिसमें मुख्य ईवेंट शामिल है जिसके कारण प्रसारण को दबाया गया था और उस पर कार्य किया गया था।

+2

लेकिन क्या यह सिर्फ वॉल्यूम बटन को कैप्चर नहीं कर रहा है? उन उपकरणों के लिए क्या होगा जो उनके पास नहीं हैं? साथ ही, उनके पास डिवाइस के बारे में क्या है, लेकिन उपयोगकर्ता को दिखाए जाने के बाद वॉल्यूम खोजबार पर छुआ है? ऐसे मामलों में, मैं घटनाओं को कैप्चर नहीं कर पाऊंगा ... –

+1

रजिस्टर मीडियाबटन EventReceiver हेडसेट बटन के लिए काम करता है लेकिन फोन हार्डवेयर बटन नहीं। मैंने बस कोशिश की। – uTubeFan

3

ठीक है, अभी के लिए, मैं क्या करता हूं, कियोडाउन (और KEYCODE_VOLUME_DOWN, KEYCODE_VOLUME_MUTE, KEYCODE_VOLUME_UP) के लिए वॉल्यूम बटन को सुनना और एक हैंडलर का उपयोग करके मैंने एक नया रननेबल पोस्ट किया है जो वॉल्यूम लेवल की जांच करता है।

भी, क्योंकि कुछ उपकरणों में वॉल्यूम डायलॉग होता है, इसलिए this link के अनुसार, जब यह गायब हो जाता है तो मैंने श्रोता जोड़ा है।

+1

चूंकि [android.media.VOLUME_CHANGED_ACTION] (http://stackoverflow.com/a/8974510/725417) एक व्यवहार्य विकल्प नहीं है और चूंकि रजिस्टर मीडियाबटन EventReceiver भी काम नहीं करता है, आपका दृष्टिकोण एकमात्र तरीका (अब तक) लगता है। धन्यवाद +1। – uTubeFan

1

प्रसारण रिसीवर VOLUME_CHANGED_ACTION का उपयोग करें, फिर वर्तमान वॉल्यूम प्राप्त करने के लिए AudioManager का उपयोग करें।

<receiver android:name="VolumeChangeReceiver" > 
    <intent-filter> 
     <action android:name="android.media.VOLUME_CHANGED_ACTION" /> 
    </intent-filter> 
</receiver> 
+0

क्या आप वाकई काम करते हैं? क्या आपने इसे पढ़ा है: http://stackoverflow.com/a/8974510/878126? –

+0

@androiddeveloper यह कई मामलों में काम करता है, इसकी कोई गारंटी नहीं है क्योंकि यह सिस्टम-प्राइवेट है और इसलिए सूचना के बिना परिवर्तन/हटाने के अधीन है। – CCJ

+0

निश्चित रूप से –

15

बेहतर, आप एक ContentObserver इस प्रकार के रूप में रजिस्टर कर सकते हैं:

getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, new ContentObserver(){...}); 

आपका ContentObserver इस प्रकार दिखाई देंगे:

public class SettingsContentObserver extends ContentObserver { 
    private AudioManager audioManager; 

    public SettingsContentObserver(Context context, Handler handler) { 
     super(handler); 
     audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
    } 

    @Override 
    public boolean deliverSelfNotifications() { 
     return false; 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 

     Log.d(TAG, "Volume now " + currentVolume); 
    } 
} 

काम पूरा हो जाने:

getApplicationContext().getContentResolver().unregisterContentObserver(mContentObserver); 

एक सावधानी ओह एच - कभी-कभी अधिसूचनाएं देरी लगती हैं यदि बहुत सारे बटन दबाए जाते हैं।

+0

के लिए एंड्रॉइड ओ पर काम नहीं करेगा वॉल्यूम बटन के लिए मैं एक लंबी प्रेस कैसे देख सकता हूं? –

+0

धन्यवाद मेरे लिए यह काम है। –

+0

को स्वीकृत उत्तर के रूप में चिह्नित किया जाना चाहिए .. – Opiatefuchs