2017-08-30 29 views
7

मेरे टेक्स्ट-टू-स्पीच ऐप में उपयोग किए जाने वाले हेडसेट से मीडिया बटन को संभालने के लिए कोड एंड्रॉइड एपीआई 22 से 25 के तहत बहुत अच्छा काम करता है (एंड्रॉइड के पुराने संस्करणों में वे हैं दूसरे द्वारा संभाला गया, अब अवमूल्यन साधन)। हालांकि एंड्रॉइड 8 "ओरेओ" के तहत, सार्वजनिक बीटा और अंतिम रिलीज दोनों, यह काम नहीं करता है।एंड्रॉइड "ओ" (ओरेओ, 8) मीडिया बटन

जब सेवा शुरू होता है मैं MediaSessionCompact वस्तु बनाने,:

 mSession = new MediaSessionCompat(getApplicationContext(), "my.package.name._player_session"); 
     mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
     mSession.setActive(true); 
     mSession.setCallback(myMediaSessionCallback); 
     PlaybackStateCompat state = new PlaybackStateCompat.Builder() 
       .setActions(ACTION_PLAY_PAUSE | ACTION_PLAY | ACTION_PAUSE | 
         ACTION_SKIP_TO_NEXT | ACTION_SKIP_TO_PREVIOUS | 
         ACTION_FAST_FORWARD | ACTION_REWIND 
       ) 
       .setState(PlaybackStateCompat.STATE_PAUSED, 0 /*PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN*/, 1f) 
       .build(); 
     mSession.setPlaybackState(state); 

पाठ्यक्रम सत्र मीडिया कॉलबैक की है परिभाषित:

private MediaSessionCompat.Callback myMediaSessionCallback = new MediaSessionCompat.Callback() { 
    @Override 
    public boolean onMediaButtonEvent(Intent mediaButtonIntent) { 
     // The log output below never appears on "Oreo", nothing comes here. 
     Log.d(TAG, "callback onMediaButtonEvent() Compat"); 
     MediaButtonIntentReceiver.handleIntent(mediaButtonIntent.getAction(), (KeyEvent) mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT)); 
     return true; 
    } 

    @Override 
    public void onSkipToNext() { 
     //... 
    } 
    // etc. other overrides 
}; 

मैं भी उपयोग करते हुए, PendingIntent के साथ प्रयोग यहाँ प्रासंगिक कोड है MediaButtonReceiver.buildMediaButtonPendingIntent() और msession.setMediaButtonReceiver (लंबित इंटेंन्ट) सेट करें, जिसमें मेरी दिलचस्पी है, फिर मेरी सेवा में स्टार्टकॉमैंड() पर मैं मीडियाबटन रिसीवर.handleIntent (mSession, मंशा) कहता हूं:

// still in the same service:    
mSession.setMediaButtonReceiver(
      MediaButtonReceiver.buildMediaButtonPendingIntent(
       this, 
       mMediaButtonReceiverComponentName, 
       ACTION_PLAY)); 


mSession.setMediaButtonReceiver(
      MediaButtonReceiver.buildMediaButtonPendingIntent(
       this, 
       mMediaButtonReceiverComponentName, 
       ACTION_PAUSE)); 


mSession.setMediaButtonReceiver(
      MediaButtonReceiver.buildMediaButtonPendingIntent(
       this, 
       mMediaButtonReceiverComponentName, 
       ACTION_PLAY_PAUSE)); 

और सेवा onStartCommand() में:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // ... 
    if (intent != null) { 
     MediaButtonReceiver.handleIntent(mSession, intent); 
     // ... 
    } 
    return START_NOT_STICKY; 
} 

कुछ भी नहीं है, यह पूरी तरह से गूंगा है करने के लिए मीडिया बटन घटनाओं दबाएँ। "ओ" या मेरे कोड के साथ क्या गलत है ??? मैं पूरी तरह से परेशान हूँ।

अद्यतन 8/32/2017

मैं भी एक तुच्छ लेकिन काम कर रहे एप्लिकेशन परियोजना है कि समस्या को दर्शाता है बनाया, कृपया देखें: https://github.com/gregko/PlayerServiceSample। जब यह एंड्रॉइड 5.x से 7.x के तहत हेडसेट पर मीडिया बटन दबाया जाता है, तो यह प्रोजेक्ट लॉगकैट आउटपुट प्रदर्शित करता है, लेकिन एंड्रॉइड 8 "ओरेओ" के तहत पूरी तरह विफल रहता है।

अद्यतन 2017/09/01 अब है पर इस बारे में एंड्रॉयड समस्या ट्रैकर, जो मैं प्रस्तुत की, https://issuetracker.google.com/issues/65175978 में एक खुले मुद्दा। फिर भी मीडिया बटन ओरेओ पर परीक्षण किए गए कई संगीत प्लेयर ऐप्स में काम करते हैं, मैं यह नहीं समझ सकता कि वे उन्हें काम करने के लिए अलग-अलग क्या करते हैं ... मेरे ऐप का संदर्भ संगीत नहीं चला रहा है, लेकिन टेक्स्ट के साथ बड़े पैमाने पर पाठ पढ़ रहा है भाषण सेवा के लिए, इसलिए संगीत प्लेयर उदाहरणों से बहुत सारे कोड लागू नहीं होते हैं।

+0

चूंकि मैंने बकाया पोस्ट करने के तुरंत बाद ही इस मुद्दे को हल किया है, इसलिए बक्षीस अब प्रभावी रूप से बंद होना चाहिए। यहां ऐसा करने का कोई तरीका नहीं है जिसे मैं देख सकता हूं, तो देखते हैं कि क्या होता है ... – gregko

उत्तर

4

हल हो गया। पर "Android 8.0 Behavior Changes" गूगल पेज हम इस पाठ खोजने:

एंड्रॉयड 8.0 में (एपीआई स्तर 26) मीडिया बटन घटनाओं से निपटने अलग है:

  1. एक यूआई गतिविधि में मीडिया बटन की हैंडलिंग है नहीं बदला: मीडिया बटन घटनाओं को संभालने में अग्रभूमि गतिविधियों को अभी भी प्राथमिकता मिलती है।
  2. यदि अग्रभूमि गतिविधि मीडिया बटन ईवेंट को संभाल नहीं पाती है, तो सिस्टम ईवेंट को उस ऐप पर रूट करता है जो हाल ही में स्थानीय रूप से ऑडियो चलाता है। मीडिया सत्र की सक्रिय स्थिति, झंडे और प्लेबैक स्थिति को तब नहीं माना जाता है जब यह निर्धारित किया जाता है कि कौन सा ऐप मीडिया बटन ईवेंट प्राप्त करता है।
  3. यदि ऐप का मीडिया सत्र जारी किया गया है, तो सिस्टम मीडिया बटन ईवेंट को ऐप के मीडियाबटन रिसीवर में भेजता है यदि उसके पास है।
  4. हर दूसरे मामले के लिए, सिस्टम मीडिया बटन ईवेंट को छोड़ देता है।

सभी मैं अपने तुच्छ नमूना काम करने के लिए करना था MediaPlayer के साथ कुछ ध्वनि चलाने के लिए किया गया था। स्पष्ट रूप से टेक्स्ट-टू-स्पीच एपीआई के साथ ध्वनि बजाना योग्य नहीं है, जो मेरी राय में एक बग है।

final MediaPlayer mMediaPlayer; 
    mMediaPlayer = MediaPlayer.create(this, R.raw.silent_sound); 
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      mMediaPlayer.release(); 
     } 
    }); 
    mMediaPlayer.start(); 

अद्यतन

बग रिपोर्ट सबमिट किया गया:

यहाँ कोड मैं अपने तुच्छ नमूना को जोड़ा गया, यह काम कर कच्चे संसाधनों निर्देशिका से एक बहुत ही संक्षिप्त और चुप WAV फ़ाइल खेलने के लिए है के लिए कम से https://issuetracker.google.com/issues/65344811

अद्यतन 2, अक्टूबर 10, 2017

एंड्रॉयड समस्या ट्रैकर

Google अब कहता है कि इस संबंध में ओरेओ व्यवहार "डिजाइन द्वारा" है और इसे ठीक नहीं करेगा। उपरोक्त मुद्दे ट्रैकर पोस्ट के अंत के पास उत्तर पढ़ें। मुझे कहना होगा कि मैं निराश हूं।

+0

यदि आप एंड्रॉइड ओरेओ में इस समस्या को हल करने की परवाह करते हैं, तो कृपया Google Issue Tracker, https: // issuetracker पर समस्या विवरण में एक स्टार जोड़ें। google.com/issues/65344811 – gregko

+0

आश्चर्यजनक है कि यह काम किया। आप के लिए कई उच्च fives। मुझे उम्मीद है कि वे इसे ठीक करेंगे। – cottonBallPaws

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