2012-06-30 28 views
5

Tiêu đề làm cho âm thanh này đơn giản hơn nhiều so với .. Tôi đang cố gắng phát một ý định sẽ tạm dừng hầu hết các trình phát nhạc.Hệ thống phát lại phương tiện tạm dừng đáng tin cậy-Wide trong Android

Tôi biết tôi có thể sử dụng tạo ra một KeyEvent cho rằng sẽ phát sóng KEYCODE_MEDIA_PLAY_PAUSE với điều này:

long eventTime = SystemClock.uptimeMillis(); 
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null); 
    KeyEvent downEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0); 
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent); 
    ctx.sendOrderedBroadcast(downIntent, null); 

Và đó hoạt động. Nó sẽ tạm dừng trình phát đa phương tiện như tôi muốn, cùng với hầu hết các trình phát nhạc khác hỗ trợ các nút phát/tạm dừng tai nghe. Nhưng vì lý do nào đó, nó chỉ hoạt động một lần với trình phát nhạc cổ. Tôi có thể nhấn nút để gọi điều này và nó sẽ tạm dừng nhạc. Nếu tôi bắt đầu chơi nó một lần nữa, và nhấn nút tạm dừng của tôi một lần nữa, nó không hoạt động. Khi tôi khởi động lại thiết bị, thiết bị sẽ hoạt động lại một lần nữa. Nhưng sau đó, với Pandora, nó hoạt động nhất quán như nó cần.

Tôi nghĩ rằng tôi có thể làm việc xung quanh điều đó và chỉ dừng lại mà không cần sử dụng KeyEvent. Tôi đã thử điều này với AudioManager và một mục đích khác:

AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);  
    if (mAudioManager.isMusicActive()) { 
     Intent mediaIntent = new Intent("com.android.music.musicservicecommand"); 
     mediaIntent.putExtra("command", "pause"); 
     ctx.sendBroadcast(mediaIntent); 
    } 

Và điều này cũng hoạt động và nó hoạt động nhất quán. Nhưng nó vốn dĩ mong manh, bởi vì bằng cách gửi ý định trực tiếp tới trình phát nhạc Android, đó là trình phát duy nhất mà nó sẽ hoạt động. Không kiểm soát Pandora, Last.FM, v.v. và tôi cần nó để làm việc với hầu hết các máy nghe nhạc.

Tôi không chắc sẽ đi đâu tiếp theo. Tôi không cầu kỳ về loại giải pháp mà tôi được cung cấp miễn là nó hoạt động. Nếu bạn có thể giúp tôi làm cho KeyEvent hoạt động, tuyệt vời, nếu bạn có một số giải pháp hoàn toàn khác, tuyệt vời. Tôi chỉ muốn nó làm việc! Cảm ơn!

+0

Mọi thứ bạn làm ở đây đều "dễ vỡ". Hơn nữa, sẽ có rất nhiều người chơi phương tiện truyền thông sẽ hoàn toàn bỏ qua sự kiện này. Và hoàn toàn có thể là một ngày nào đó hệ điều hành sẽ bắt đầu chặn các sự kiện giả mạo 'ACTION_MEDIA_BUTTON' theo cách chúng chặn các sự kiện giả mạo tương tự khác. Nếu bạn đang viết trình phát media của riêng mình, hãy sử dụng các tính năng lấy nét âm thanh trong 'AudioManager' để lấy tiêu điểm âm thanh. – CommonsWare

+0

Tôi không thực sự viết trình phát đa phương tiện của riêng mình. Tôi biết có rất nhiều ứng dụng đầy đủ chức năng trên Cửa hàng Play sẽ ngừng nhạc sau một khoảng thời gian nhất định, nhưng tôi không đặc biệt hài lòng với bất kỳ ứng dụng nào trong số đó. Tôi chỉ cố gắng viết bài của riêng mình trên một, và tôi cần để có thể tạm dừng hầu hết các ứng dụng âm nhạc. – Geniusdog254

Trả lời

2

Để tạm dừng âm thanh của hệ thống, bạn không bắt đầu ý định mà yêu cầu tập trung âm thanh từ hệ thống.

Vì vậy, khi bạn muốn tạm dừng tất cả mọi thứ làm như sau (đề xuất trong onCreate):

//The Variables we'll need to create 
AudioManager am; 
OnAudioFocusChangeListener af; 

//I do nothing with this listener, but it's required for the next step. 
af = new OnAudioFocusChangeListener() { 

     public void onAudioFocusChange(int focusChange) { 
      if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { 
       // Lower the volume 
      } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
       // Raise it back to normal 
      }  
     } 

}; 

//Do the actual pause 
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
int request = am.requestAudioFocus(af, 
    AudioManager.STREAM_MUSIC, 
    AudioManager.AUDIOFOCUS_GAIN); 

Nhưng đừng quên buông tập trung sử dụng:

am.abandonAudioFocus(af); 
+0

Những nếu/người nào khác bên trong người nghe chỉ được sao chép từ tài liệu của Android và không làm gì cả, bạn có thể xóa chúng. –

4

tôi chạy qua đây cũng. Nhờ mô tả của bạn về nó, tôi nghĩ rằng tôi hiểu những gì đang xảy ra. Bạn gửi sự kiện keydown, nhưng không bao giờ keyup để hệ thống nghĩ rằng nút play/pause đang được liên tục nhấn. Tôi đã sử dụng đoạn mã này thành công.

Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); 
mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
context.sendBroadcast(mediaEvent); 

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
     Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     KeyEvent event = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_MEDIA_PLAY); 
     mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event); 
     context.sendBroadcast(mediaEvent); 
    } 
}, 100); 
Các vấn đề liên quan