2017-08-30 26 views
7

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.

+0

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

Trả lời

4

Đã giải quyết. On "Android 8.0 Behavior Changes" trang Google, chúng tôi tìm thấy văn bản này:

Trong Android 8.0 (API mức 26) Sử dụng các nút sự kiện truyền thông khác:

  1. Việc xử lý các nút phương tiện truyền thông trong một hoạt động giao diện người dùng có không thay đổi: hoạt động tiền cảnh vẫn được ưu tiên trong việc xử lý các sự kiện nút phương tiện.
  2. Nếu hoạt động nền trước không xử lý sự kiện nút phương tiện, hệ thống sẽ định tuyến sự kiện đến ứng dụng gần đây nhất phát âm thanh cục bộ. Trạng thái hoạt động, cờ và trạng thái phát của phiên truyền thông không được xem xét khi xác định ứng dụng nào nhận được sự kiện nút phương tiện.
  3. Nếu phiên truyền thông của ứng dụng đã được phát hành, hệ thống sẽ gửi sự kiện nút phương tiện đến MediaButtonReceiver của ứng dụng nếu có.
  4. Đối với mọi trường hợp khác, hệ thống sẽ hủy sự kiện nút phương tiện.

Tất cả những gì tôi phải làm để làm công việc mẫu tầm thường của tôi là phát ra âm thanh với MediaPlayer. Rõ ràng là chơi âm thanh với Text-to-Speech API không đủ điều kiện, theo ý kiến ​​của tôi là một lỗi.

Đây là mã tôi thêm vào mẫu tầm thường của tôi để làm cho nó làm việc, chơi một file WAV rất ngắn gọn và im lặng từ thư mục nguồn liệu:

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(); 

Cập nhật

Đăng báo cáo lỗi để theo dõi vấn đề Android tại https://issuetracker.google.com/issues/65344811

cập nhật 2, 10 tháng 10 năm 2017

Google hiện nói rằng hành vi Oreo trong khía cạnh này là "theo thiết kế" và sẽ không khắc phục được. Đọc câu trả lời ở gần cuối bài đăng theo dõi vấn đề ở trên. Tôi phải nói rằng tôi thất vọng.

+0

Nếu bạn quan tâm đến việc giải quyết vấn đề này trong Android Oreo, vui lòng thêm một ngôi sao vào mô tả vấn đề trên Google Issue Tracker, https: // issuetracker. google.com/issues/65344811 – gregko

+0

Thật tuyệt vời vì điều này đã hiệu quả. Nhiều fives cao cho bạn. Tôi hy vọng họ sửa lỗi này. – cottonBallPaws

Các vấn đề liên quan