2011-08-04 7 views
17

मेरे पास एक ऐप है जो फ़ोन पर उपयोग किए जाने पर स्पीकरफ़ोन टॉगल बटन प्रदर्शित करता है। टॉगल फोन की इयरपीस और स्पीकरफ़ोन के बीच ऑडियो रूटिंग स्विच करता है। हालांकि, जब ऐप एक टैबलेट पर चलाया जाता है (या किसी भी डिवाइस जिसमें इयरपीस की कमी होती है), तो मैं टॉगल को हटाना चाहता हूं, क्योंकि सभी ऑडियो स्पीकरफ़ोन के माध्यम से रूट किए जाते हैं।एंड्रॉइड डिवाइस पर इयरपीस (स्पीकरफ़ोन केवल) की कमी का पता लगाएं

आदर्श रूप में, मैं किसी प्रकार का isEarpiecePresent() कॉल का उपयोग करना चाहता हूं, या शायद इस जानकारी को ढूंढने के लिए कुछ कॉन्फ़िगरेशन ऑब्जेक्ट पर ध्वज की जांच करना चाहता हूं, लेकिन मुझे एपीआई में इस तरह के कुछ भी नहीं मिल रहे हैं।

मैंने AudioManager.setSpeakerphoneOn(false) पर कॉल करके इस मुद्दे के आसपास काम करने का प्रयास किया, फिर AudioManager.isSpeakerphoneOn() की जांच करके, यह उम्मीद करते हुए कि यह अभी भी सच हो जाएगा और मैं इससे बाहर निकल सकता हूं। सिस्टम false लौटा, भले ही ऑडियो स्पीकर के माध्यम से अभी भी चल रहा हो।

मैं वर्तमान में टेलीफोनी क्षमता की जांच करने की सोच रहा हूं, भले ही यह बिल्कुल फिट न हो। कोई अन्य विचार?

+1

FYI है, मुझे नहीं लगता कि टेलीफोनी क्षमता विश्वसनीय, जैसे हो जाएगा सैमसंग गैलेक्सी टैब जिसे मैंने टेलीफोनी का समर्थन किया है, लेकिन इसमें इयरपीस स्पीकर नहीं है। http://en.wikipedia.org/wiki/Samsung_Galaxy_Tab –

+1

क्या आपने यह जांच लिया? http://developer.android.com/training/managing-audio/audio-output.html – Dusko

+0

धन्यवाद स्टेटोसिना, लेकिन दुर्भाग्य से ऑडियो आउटपुट हार्डवेयर की पहचान के संबंध में उन दस्तावेज़ों में कुछ भी नहीं है। – Josh

उत्तर

2

मैंने इसका शोध किया है और दुर्भाग्यवश मुझे यह पता लगाने के लिए कोई एपीआई समर्थन नहीं मिल रहा है कि इयरपीस मौजूद है या नहीं।

अब मैं एक सुविधा का अनुरोध के रूप में गूगल के साथ इस उठाया गया है:
http://code.google.com/p/android/issues/detail?id=37623

आप की सुविधा के साथ सहमत हैं, तो इसके लिए वोट करने के लिए गूगल मुद्दा पृष्ठ के तल पर तारे पर क्लिक करें!

उन बहुत से मुद्दे को उठाया है कि गूगल टॉक एक वक्ता/इयरपीस टॉगल विकल्प है, जो शायद एक उपयुक्त एपीआई के अभाव से पता चलता है ...
http://code.google.com/p/android/issues/detail?id=19221

एक समाधान आप चाहते हो सकता है के रूप में प्रदान नहीं करता है इसका अनुमान उपकरणों पर सुविधा को छिपाने के लिए (इन तरीकों के सभी कमियां हैं):

  • अतिरिक्त बड़ी स्क्रीन (यानी गोलियाँ)
  • के साथ उन लोगों के लिए कोई टेलीफोनी समर्थन के साथ उन लोगों
  • मुख्य डिवाइस की कॉन्फ़िगर करने योग्य सफेद/ब्लैकलिस्ट का उपयोग करें जिसमें इयरपीस न हो।

FTR, यदि आप इयरपीस के लिए रास्ते में ऑडियो के लिए this answer उपयोग करते हैं, वहाँ किसी भी नकारात्मक पक्ष Xoom (ओएस 3.1) या पर कि कोड चलाने को प्रभावित करता है होना करने के लिए नहीं है सैमसंग गैलेक्सी टैब (ओएस 2.2) - ऑडियो सिर्फ बाहरी स्पीकर के माध्यम से खेलना जारी रखता है। ब्लूटूथ हेडसेट के साथ अभी तक कोई इंटरैक्शन नहीं होने पर मुझे परीक्षण करने का मौका नहीं मिला है।

+0

मैं इसे हैक करने में कामयाब रहा, यह लॉलीपॉप पर ठीक काम करता है जहां मैंने अभी परीक्षण किया .. विवरण के लिए मेरा उत्तर देखें – milosmns

-3

आप ऑडियो प्रबंधक

Audio Manager

का उपयोग करके इस जाँच कर सकते हैं और यह भी

Head Set Plugged

+3

क्षमा करें, यह प्रश्न वायर्ड हेडसेट के बारे में नहीं है। AudioManager में मूल प्रश्न संदर्भ विधियां, इसलिए हम इसके बारे में पहले से ही जानते हैं। –

1

देखो तुम अब जानते होंगे कि, इस वर्तमान Android एपीआई का उपयोग नहीं किया जा सकता।

ऑडियो हार्डवेयर इंटरफ़ेस स्वामित्व है, यानी निर्माताओं द्वारा उनके हार्डवेयर के लिए लिखा गया है और एंड्रॉइड एसडीके का उपयोग करके विकसित अनुप्रयोगों के साथ संगत बनाने के लिए एंड्रॉइड सिस्टम द्वारा कुछ कॉल का समर्थन करना है।

भले ही आपको एक डिवाइस के लिए एपीआई समर्थन की कमी के आसपास कोई रास्ता मिल जाए, यह सभी उपकरणों पर काम नहीं कर सकता है। आपका AudioManager.setSpeakerphoneOn(false) उदाहरण डिवाइस के लिए बहुत अच्छा काम कर सकता है क्योंकि यह सब इस बात पर निर्भर करता है कि ऑडियो हार्डवेयर इंटरफ़ेस कैसे लिखा गया है। यह मेरी धारणा होगी कि अधिकांश टैबलेट इयरपीस के लिए ऑडियो रूटिंग का इलाज करेंगे और स्पीकर समान होगा यदि कोई इयरपीस नहीं है।

आप नेक्सस 7 के लिए ऑडियो हार्डवेयर इंटरफेस कोड की जाँच करना चाहते हैं, it's here

-2
public boolean isEarPieceConnected() { 
     AudioManager audio = (AudioManager) this 
       .getSystemService(Context.AUDIO_SERVICE); 
     if (audio.isWiredHeadsetOn()) { 
      Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); 
      return true; 
     } else { 
      Toast.makeText(this, "Not Connected", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    } 

आप भी audio.isSpeakerphoneOn()

मैं इस काम करता है अगर मैं हो रही है आशा के लिए जाँच कर सकते हैं आपकी समस्या सही है।

+2

क्षमा करें, नहीं - सवाल ईरपीस में निर्मित, वायर्ड हेडसेट नहीं है। इसके अलावा, isWiredHeadsetOn() को बहिष्कृत किया गया है, और इसके दस्तावेज़ बताते हैं "यह मान्य संकेत नहीं है कि ऑडियो प्लेबैक वास्तव में वायर्ड हेडसेट पर है क्योंकि ऑडियो रूटिंग अन्य स्थितियों पर निर्भर करती है।" –

3

तो बदसूरत हिस्सा है - Google समस्या को अनदेखा कर रहा है। सुंदर हिस्सा यह है कि मैं वास्तव में इयरपीस के लिए चेक करने में कामयाब रहा, और 5/5 उपकरणों पर यह ठीक काम करता था (5.0, 5.1, 6.0 पर परीक्षण किया गया)। और फिर, बदसूरत बात यह है कि यह सिर्फ बुरा है, अस्थिर कोड यहाँ हैक है है और है कि यह hacky है, लेकिन जब तक वे एक बेहतर एपीआई प्रकाशित करते हैं, मैं ज्यादा कुछ नहीं कर सकता है ..

:

private Boolean mHasEarpiece = null; // intentionally 'B' instead of 'b' 

public boolean hasEarpiece() { 
    if (mHasEarpiece != null) { 
     return mHasEarpiece; 
    } 

    // not calculated yet, do it now 
    try { 
     Method method = AudioManager.class.getMethod("getDevicesForStream", Integer.TYPE); 
     Field field = AudioManager.class.getField("DEVICE_OUT_EARPIECE"); 
     int earpieceFlag = field.getInt(null); 
     int bitmaskResult = (int) method.invoke(mAudioManager, AudioManager.STREAM_VOICE_CALL); 

     // check if masked by the earpiece flag 
     if ((bitmaskResult & earpieceFlag) == earpieceFlag) { 
      mHasEarpiece = Boolean.TRUE; 
     } else { 
      mHasEarpiece = Boolean.FALSE; 
     } 
    } catch (Throwable error) { 
     Log.e(TAG, "Error while checking earpiece! ", error); 
     mHasEarpiece = Boolean.FALSE; 
    } 

    return mHasEarpiece; 
} 

मैं सुधार के लिए खुला रहा हूँ संपादित करता है अगर आप कुछ बेहतर :)

+0

कैविट एम्प्टर: मैंने इसे बहुत अधिक डीबग नहीं किया है, लेकिन मैंने देखा है कि यह विधि एक बीएलयू एडवांस (एंड्रॉइड 5.1) फोन पर "सत्य" और "झूठी" दोनों को वापस लौटाती है, जिसमें निश्चित रूप से एक इयरपीस होता है। मान लीजिए कि मैं इस विधि का उपयोग कुछ विरासत कोड के साथ कर रहा था जो ऑडियोमैनेजर के साथ मिलती है, लेकिन मुझे लगता है कि DEVICE_OUT_EARPIECE जैसे फ़ील्ड स्थिर और स्वतंत्र होने के बारे में स्वतंत्र होंगे? –

+0

हाँ, यह हैकी की तरह है, यकीन नहीं है कि ऐसा क्यों होता है। – milosmns

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