मेरे टेक्स्ट-टू-स्पीच ऐप में उपयोग किए जाने वाले हेडसेट से मीडिया बटन को संभालने के लिए कोड एंड्रॉइड एपीआई 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 में एक खुले मुद्दा। फिर भी मीडिया बटन ओरेओ पर परीक्षण किए गए कई संगीत प्लेयर ऐप्स में काम करते हैं, मैं यह नहीं समझ सकता कि वे उन्हें काम करने के लिए अलग-अलग क्या करते हैं ... मेरे ऐप का संदर्भ संगीत नहीं चला रहा है, लेकिन टेक्स्ट के साथ बड़े पैमाने पर पाठ पढ़ रहा है भाषण सेवा के लिए, इसलिए संगीत प्लेयर उदाहरणों से बहुत सारे कोड लागू नहीं होते हैं।
चूंकि मैंने बकाया पोस्ट करने के तुरंत बाद ही इस मुद्दे को हल किया है, इसलिए बक्षीस अब प्रभावी रूप से बंद होना चाहिए। यहां ऐसा करने का कोई तरीका नहीं है जिसे मैं देख सकता हूं, तो देखते हैं कि क्या होता है ... – gregko