2012-07-14 33 views
9

Tôi đang viết một ứng dụng thông báo cho người dùng thông tin nhạy cảm rất thời gian và tôi nghĩ nhiều người trong số họ muốn sử dụng nhạc chuông điện thoại thay vì chỉ là âm thanh thông báo ngắn. Tôi đã kích hoạt tính năng này bằng cách thiết lập android:ringtoneType="all" trong PreferenceScreen của tôi, và nó hoạt động tuyệt vời NGOẠI TRỪ rằng khi một nhạc chuông điện thoại được chọn, nó tiếp tục chơi mãi mãi cho đến khi người dùng chạm vào thanh thông báo ... làm thế nào tôi có thể làm cho nó tắt sau 30 giây hoặc vậy, không hủy thông báo?Làm thế nào để ngừng nhạc chuông thông báo android sau 30 giây?

heres mã Tôi đang sử dụng trong máy thu C2DM của tôi:

NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
Notification notif = new Notification(....) 
.... 
String ringtone = PreferenceManager.getDefaultSharedPreferences(context).getString("ringtone", ""); 
notif.sound = Uri.parse(ringtone); 
notif.audioStreamType = AudioManager.STREAM_NOTIFICATION; 
nm.notify(1, notif); 
+4

ngoại tuyến: C2DM không được dùng để viết lại bằng cách sử dụng Google Clound Messaging (GCM) –

Trả lời

6

Android không cung cấp cho bạn truy cập vào can thiệp vào thông báo chơi âm thanh nhưng nếu bạn có đầy đủ sự kiểm soát của nhạc chuông bạn đang chơi , sau đó bạn có thể dừng lại sau 30 giây hoặc làm bất cứ điều gì bạn muốn với nó.

Ở đây, tôi giả định rằng bạn đang sử dụng dịch vụ nền để thực hiện thông báo.

Là bước sơ bộ, bạn nên thực hiện thông báo mà không có âm thanh. Chỉ cần một thông báo thanh tác vụ đơn giản, mặc định. Sau đó, chúng tôi sẽ sử dụng đối tượng MediaPlayer của riêng mình để phát nhạc chuông trong 30 giây.

1) NẾU BẠN ĐANG THỰC HIỆN THÔNG BÁO TRÊN SPOT: Tạo đối tượng MediaPlayer, bắt đầu phát nhạc chuông mà người dùng đã chọn ngay sau khi bạn bắt đầu thông báo. Sau đó, đếm 30 giây bằng Bộ hẹn giờ và TimerTask (see example here về cách sử dụng chúng) hoặc ScheduledThreadPoolExecutor và gọi dừng MediaPlayer() để dừng nhạc chuông sau 30 giây.

2) NẾU BẠN ĐANG SỬA ĐỔI THÔNG BÁO LẦN THỜI GIAN: Ngay khi bạn đặt thông báo, hãy tạo AlarmManager và lên lịch để nó sẽ được kích hoạt cùng lúc với thông báo của bạn. Báo thức của bạn có thể kích hoạt một dịch vụ nền khác mà bạn đã viết trong đó bạn phát nhạc chuông trong 30 giây bằng cách sử dụng đối tượng MediaPlayer như được giải thích trong phần 1).

Trong cả hai trường hợp, thông báo sẽ vẫn ở đó và cách bạn sẽ phát nhạc chuông sẽ hoàn toàn độc lập với nó. Bạn sẽ có toàn quyền kiểm soát nhạc chuông. Bạn thậm chí có thể phát lại trong 30 giây sau một thời gian được lên lịch nếu người dùng chưa kiểm tra thông báo cho đến thời điểm đó (vì bạn đang nói rằng thông báo này cung cấp thông tin nhạy cảm, nếu không tôi sẽ không báo lỗi người dùng bằng nhạc chuông khăng khăng).

+0

có cách nào khi người dùng chạm vào thanh thông báo để tôi phát hiện và tắt báo thức không? Khác với nó sẽ là khá khó chịu để có nhạc chuông tiếp tục chơi .. Nếu đó là thay thế duy nhất tôi chỉ có thể tư vấn cho họ để tải về một số thông báo mở rộng tông hoặc một cái gì đó –

+0

Tất nhiên, có rất nhiều cách để phát hiện nó và tất cả phụ thuộc vào những gì bạn muốn thông báo của bạn làm. Sau đó, bạn nên giao tiếp giữa các hoạt động kết quả nhận được ý định của thông báo của bạn và dịch vụ của bạn giữ đối tượng mediaplayer và hủy phát lại. Dưới đây là hướng dẫn chi tiết về cách nắm bắt thông báo: http://developer.android.com/guide/topics/ui/notifiers/notifications.html – Erol

+0

Tôi không nói về thời điểm thông báo được nhấp hoặc thậm chí bị loại bỏ. Ý tôi là bình thường nếu người dùng chỉ chạm vào đầu thanh thông báo, không có âm thanh nào được phát nữa. Tôi không thấy cách nào để nắm bắt điều đó, tôi có sai không? –

11

Điều này nên thực hiện.

.... 
mediaPlayer.start(); 
.... 
final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if (mediaPlayer.isPlaying()) 
       mediaPlayer.stop(); 
     } 
    }, timeout); 
+0

Trường hợp bạn có phiên bản mediaPlayer từ đâu? – RaphMclee

1

Cách giải quyết đơn giản là hủy thông báo sau 30 giây và tạo thông báo mới.

Bạn thậm chí có thể sao chép Thông báo ban đầu và chỉ cần xóa nhạc chuông cho thông báo mới.

+0

Tôi làm cách nào để phát hiện xem thông báo đã bị người dùng hủy hay chưa, vì vậy tôi không chỉ gửi thông báo trùng lặp sau khi họ đã nhấp vào thông báo đó? –

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