2012-07-14 4 views
9

私は非常に時間の影響を受けやすい情報をユーザーに通知するアプリケーションを作成しています。多くのユーザーが短い通知音の代わりに電話着信音を使いたいと思っています。私はこの機能を私のPreferenceScreenにandroid:ringtoneType="all"を設定して有効にしました。電話着信音が選択されているときは、ユーザーが通知バーに触れるまでずっと再生し続けます... 30秒後に電源を切るにはどうすればいいですか?そう、通知をキャンセルすることなく?30秒後にアンドロイド通知着信音を停止するには?

私はC2DMの受信機で使用している相続コード:

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

offtopic:C2DMはGoogle Clound Messaging(GCM)を使用して書き換えられます –

答えて

6

Androidはあなたがサウンドを再生通知に干渉へのアクセス権を与えるものではありませんが、着信音の完全な制御を持っている場合は、あなたがプレイしています30秒後にそれをやめるか、それを使って何でもすることができます。

ここでは、通知を実行するためにバックグラウンドサービスを使用していると仮定しています。

暫定的な手順として、告知を音声なしで行う必要があります。単にデフォルトの単純なタスクバー通知です。次に、自分自身のMediaPlayerオブジェクトを使用して、着信音を30秒間再生します。

1)通知を通知している場合:MediaPlayerオブジェクトを作成し、通知を開始した直後にユーザーが選択した着信音の再生を開始します。その後、タイマとタイマータスク(使用方法はsee example here)またはScheduledThreadPoolExecutorで30秒をカウントし、MediaPlayer stop()を呼び出して30秒後に着信音を停止します。

2)通知を遅くスケジュールする場合:通知を設定するとすぐに、AlarmManagerを作成し、通知と同時にトリガーするようにスケジュールを設定します。あなたのアラームは、パート1で説明したMediaPlayerオブジェクトを使用して30秒間着信音を鳴らして書き込んだ別のバックグラウンドサービスをトリガーする可能性があります。

どちらの場合でも、通知はそのままで、着信音の再生方法は完全に独立しています。あなたは着信音を完全に制御できます。ユーザーがその時刻までの通知をチェックしていない場合(通知が非常に時間の影響を受けやすい情報を提供していると言われているので、予定された時間の後にもう30秒間それを再生することもできます。と主張している)。

+0

ユーザが通知バーに触れてアラームをオフにする方法はありますか?それ以外の場合は、着信音を鳴らすのはかなり迷惑でしょう。もし唯一の選択肢であれば、拡張通知音や何かをダウンロードするようアドバイスしてくれるかもしれません。 –

+0

もちろん、それを検出する方法はたくさんあります。通知する必要があります。その後、通知の意図を受け取った結果のアクティビティと、メディアプレイヤーオブジェクトを保持するサービスとの間で通信し、再生をキャンセルする必要があります。通知をキャプチャする方法の詳細なチュートリアルは、http://developer.android.com/guide/topics/ui/notifiers/notificationsです。html – Erol

+0

私は、通知がクリックされたとき、または却下されたときについては話しません。私は通常、ユーザーが通知バーの上部に触れるだけで、それ以上のサウンドは再生されません。私はそれをキャプチャする方法を参照してください、間違っている? –

11

これはそれを行う必要があります。

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

ここからmediaPlayerインスタンスを取得しましたか? – RaphMclee

1

単純な回避策は、30秒後に通知をキャンセルして新しい通知を作成することです。

元の通知を複製して、新しい通知の着信音を削除することもできます。

+0

通知が既にユーザーによってキャンセルされているかどうかを検出するにはどうすればいいですか?既にクリックした後に重複通知を出すだけではないのですか? –

関連する問題