Mã để xử lý các nút phương tiện từ tai nghe mà tôi sử dụng trong ứng dụng Chuyển văn bản thành thạo tuyệt vời trong API Android từ 22 đến 25 (trong các phiên bản Android cũ hơn) được xử lý bằng phương tiện khác, hiện đang khấu hao). Tuy nhiên dưới Android 8 "Oreo", cả bản beta công khai và bản phát hành cuối cùng, nó không hoạt động. Đây là mã có liên quan:Các nút phương tiện truyền thông "O" (Oreo, 8) của Android phát hành
Khi dịch vụ bắt đầu, tôi có thể tạo đối tượng 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);
Có tất nhiên phiên truyền thông gọi lại định nghĩa:
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
};
Tôi cũng đã thử nghiệm với PendingIntent, sử dụng MediaButtonReceiver.buildMediaButtonPendingIntent() và thiết lập mSession.setMediaButtonReceiver (pendingIntent) cho tất cả các hành động mà tôi quan tâm, sau đó trong dịch vụ của tôi onStartCommand() tôi gọi MediaButtonReceiver.handleIntent (mSession, intent):
// 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));
và trong dịch vụ onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// ...
if (intent != null) {
MediaButtonReceiver.handleIntent(mSession, intent);
// ...
}
return START_NOT_STICKY;
}
Không có gì, nó hoàn toàn câm để nút media nhấn các sự kiện. Có gì sai với "O" hoặc mã của tôi ở đó ??? Tôi hoàn toàn bối rối.
Cập nhật 8/32/2017
Tôi cũng tạo ra một dự án ứng dụng tầm thường nhưng làm việc đó chứng tỏ vấn đề, vui lòng xem: https://github.com/gregko/PlayerServiceSample. Dự án này hiển thị đầu ra LogCat khi một nút phương tiện được nhấn vào tai nghe trong Android 5.x đến 7.x, nhưng không hoàn toàn dưới Android 8 "Oreo".
Cập nhật 9/1/2017 Hiện đã có sự cố mở trên Trình theo dõi vấn đề Android về điều này, mà tôi đã gửi, tại https://issuetracker.google.com/issues/65175978. Tuy nhiên, các nút phương tiện truyền thông hoạt động trong một số ứng dụng nghe nhạc tôi đã thử nghiệm trên Oreo, tôi không thể biết được họ làm gì khác để làm cho chúng hoạt động ... Dịch vụ giọng nói, do đó, rất nhiều mã từ các ví dụ của Trình phát nhạc không áp dụng.
Vì tôi đã tự giải quyết vấn đề này ngay sau khi đăng tải tiền thưởng, tiền thưởng sẽ được đóng lại ngay bây giờ. Không có cách nào để làm điều đó ở đây mà tôi có thể thấy, vì vậy hãy xem điều gì sẽ xảy ra ... – gregko