2014-10-29 17 views
11

मैनिफेस्ट में एपीआई स्तर 18 या उससे ऊपर लक्षित करते समय AudioManager.startBluetoothSCO() पर कॉल करते समय, दस्तावेज़ीकरण बताता है कि एक कच्चा ऑडियो कनेक्शन स्थापित किया गया है, और यदि एपीआई 17 या वर्चुअल वॉयस के नीचे लक्ष्यीकरण कॉल का उपयोग किया जाता है।AudioManager.startBluetoothSco() एंड्रॉइड लॉलीपॉप पर क्रैश

एपीआई स्तर 20 (एंड्रॉइड एल पूर्वावलोकन) तक यह किसी भी एपीआई को लक्षित करने के लिए ठीक काम करता है। हालांकि, नवीनतम एंड्रॉइड लॉलीपॉप का निर्माण करते समय एलपीएक्स 13 डी और लक्ष्यीकरण एपीआई स्तर 18 या उससे ऊपर का उपयोग करते समय मुझे निम्नलिखित स्टैक ट्रेस के साथ एक क्रैश मिलता है:

ई/एंड्रॉइड रनटाइम (31705): इसके कारण: java.lang.NullPointerException: इनकार करने का प्रयास आभासी विधि 'java.lang.String android.bluetooth.BluetoothDevice.getAddress()' एक शून्य ऑब्जेक्ट संदर्भ ई/एंड्रॉइड रनटाइम (31705) पर: android.os.Parcel.readException (Parcel.java:1546) ई/एंड्रॉइड रनटाइम (31705): android.os.Parcel.readException (Parcel.java:1493) ई/एंड्रॉइड रनटाइम (31705): android.media.IAudioService $ Stub $ Proxy.startBluetoothSco (IAudioService.java:1587) ई/एंड्रॉइड रनटाइम (31705): atroid.media.AudioManager.startBluetoothSco (AudioManager.java:1468)

यदि मैं एंड्रॉइड लॉलीपॉप पर एपीआई स्तर 17 या नीचे लक्षित करता हूं तो सब कुछ अपेक्षित काम करता है।

मेरा मानना ​​है कि समस्या के स्रोत है कि फाइल AudioService.java लाइन 2392 में एपीआई स्तर 21 में हुआ Android के ऑडियो कोड में एक परिवर्तन में निहित है:

public void startBluetoothSco(IBinder cb, int targetSdkVersion) { 
    int scoAudioMode = 
      (targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2) ? 
        SCO_MODE_VIRTUAL_CALL : SCO_MODE_UNDEFINED; 
    startBluetoothScoInt(cb, scoAudioMode); 
} 

यह SCO_MODE_UNDEFINED तरह लग रहा है के बजाय SCO_MODE_RAW होना चाहिए। यदि आप फ़ाइल को देखते हैं तो आप देख सकते हैं कि SCO_MODE_RAW कुछ स्थानों पर चेक किया गया है, लेकिन वास्तव में कभी भी कहीं भी पारित नहीं किया जाता है।

क्या कोई और इस दुर्घटना का सामना कर रहा है? क्या किसी को लक्ष्य एसडीके को 17 से घटाकर बेहतर सुधार के बारे में पता है? यदि नहीं, तो आप स्टार कृपया सकता है bug report मैं गूगल के साथ दायर एक सरल समाधान का अवसर बढ़ाने के लिए है कि यह :-)

+0

भले ही मुझे क्रैश न हो, तो डिवाइस ब्लूटूथ माइक से ऑडियो रूट नहीं कर रहा है। –

+0

मुझे एक ही समस्या है, माइक रूटिंग नहीं कर रहा है, इसके लिए कोई समाधान? –

उत्तर

0

देखा जाएगा निराशा के कुछ दिनों के बाद मैंने पाया:

startBluetoothSco() फेंकता एनपीई केवल तभी जब कोई ब्लूटूथ डिवाइस कनेक्ट नहीं होता है, तो इसे पकड़ा और अनदेखा किया जा सकता है क्योंकि "कोई बात करने के लिए कोई नहीं" है। यदि एक बीटी हेडसेट जुड़ा हुआ है, तो एससीओ सफलतापूर्वक शुरू हो गया है और प्लेबैक काम कर रहा है!

+0

यह लक्ष्य एसडीके को 17 तक सेट करने से बेहतर कामकाज की तरह प्रतीत होता है, हालांकि आगे की जांच के बाद मैंने देखा कि दोनों वर्कअराउंड ऑडियो के साथ ब्लूटूथ माइक के माध्यम से नहीं भेजा जाता है बल्कि फोन के माइक के माध्यम से बाहर निकलता है। यदि आपके पास एक दूसरे के पास आपका फोन और ब्लूटूथ डिवाइस है तो इसे याद करना आसान है। –

0

अभी के लिए क्या मुझे NullPointerException अनदेखी था काम करने के लिए लगता है:

private void tryConnectAudio() { 
    verifyBluetoothSupport(); 
    try { 
     mAudioManager.startBluetoothSco(); 
    } catch (NullPointerException e) { 
     // TODO This is a temp workaround for Lollipop 
     Log.d(TAG, "startBluetoothSco() failed. no bluetooth device connected."); 
    } 
} 

@Julian Claudino, यह मेरे लिए काम करता है और कि ब्लूटूथ डिवाइस मान्यता प्राप्त है और जुड़ा हुआ है ब्लूटूथ माइक के माध्यम से मार्ग, सुनिश्चित करें:

private void verifyBluetoothSupport() { 
    getActivity().registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); 
      Log.d(TAG, "Audio SCO state: " + state); 
      if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) { 
       Toast.makeText(getActivity(), "Bluetooth Connected", Toast.LENGTH_SHORT).show(); 
       getActivity().unregisterReceiver(this); 
      } 
     } 
    }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)); 
} 

उम्मीद है कि यह किसी की मदद करेगा!

4

@xsveda ने लिखा है कि कोई हेडसेट कनेक्ट नहीं है, तो आपको लॉलीपॉप पर एनपीई प्राप्त होगा।

आप पहली बार ब्लूटूथ हेडसेट कनेक्शन की जांच करने के लिए प्रयास कर सकते हैं:

mAudioManager.isWiredHeadsetOn() 

दस्तावेज़ के रूप में वर्णित isWiredHeadsetOn() (doc link) depricated है और केवल का उपयोग करता है की जाँच करने के लिए एक हेडसेट या नहीं जुड़ा है।

और इसके बाद आप startBluetoothSco() कनेक्शन का उपयोग कर सकते हैं।

शुरू करने के लिए यह एक:

if(mAudioManager.isWiredHeadsetOn()) 
    mAudioManager.startBluetoothSco(); 

रोकने के लिए यह एक:

if(mAudioManager.isBluetoothScoOn()) 
      mAudioManager.stopBluetoothSco(); 

आशा है कि यह मदद करता है मेरे लिए मैं इस कोड का इस्तेमाल किया।

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