Android通知音を再生する方法


169

メディアストリーム上で再生せずに通知音を再生する方法を知りたいと思っていました。現在、メディアプレーヤーを使用してこれを行うことができますが、メディアファイルとして再生したくありません。通知、アラート、または着信音として再生したいです。ここに私のコードが今どのように見えるかの例があります:

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();

回答:


421

まだこれに対する解決策を探している人がいる場合、Androidで着信音/アラーム音を再生する方法で答えを見つけました

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

TYPE_NOTIFICATIONをTYPE_ALARMに変更できますが、再生を停止するには、着信音rを追跡する必要があります...たとえば、ユーザーがボタンまたは何かをクリックしたとき。


2
たとえばモトローラの電話では、設定のアクティビティが拡張され、ユーザーがSMSやその他のカテゴリの通知音を定義できるようになりました。上記の方法は、このタイプの電話では機能しません。この問題を解決する方法はありますか?
David

2
これでエラーが発生しました:MediaPlayer - Should have subtitle controller already set。どういう意味ですか?
2014年

このソリューションを使用すると、28/29回後、サウンドの再生が停止します。誰もが理由を知っていますか?
トムBrinkkemper

1
なぜすべての例外をキャッチするのですか?どれが投げられますか?
Miha_x64

2
@サム、はい。stackoverflow.com/q/39876885/2614353。基本的に、再生するたびにRingToneオブジェクトを作成しないでください。一度作成してから、同じオブジェクトを複数回再生します。
トムBrinkkemper

205

これを行うには、通知を個別に呼び出すのではなく、通知を作成するときに音声を含めるようにします。

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
        .setSmallIcon(icon)
        .setContentTitle(title)
        .setContentText(message)
        .setSound(soundUri); //This sets the sound to play

//Display notification
notificationManager.notify(0, mBuilder.build());

12
この解き別の問題-ない「通知を再生する方法を「通知音を再生する方法」が、音を表示します」。受け入れられた答えは、そのソリューションで正当化されます。
Fabian Tamp 2014

7
おそらく、これをSTREAM_NOTIFICATIONで再生するように設定して、OSの現在の通知音量設定で再生することもできます。.setSound(soundUri、AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle正常に動作しています。しかし、複数の通知の場合、たとえば100の通知が並行している場合、音は次の通知音と混合されます。論理的には、サウンドがすでに再生されている場合は、前の再生が完了するまで待機する必要があります。このシナリオで助けてもらえますか?
Waqas Ali Razzaq

アプリがバックグラウンドにあるときにサウンドを再生しない。なにか提案を?
Sagar Nayak

47

デフォルトの通知音を再生したい場合は、クラスのsetDefaults(int)メソッドを使用できますNotificationCompat.Builder

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(someText)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

それがあなたの仕事を達成する最も簡単な方法だと思います。


アプリがバックグラウンドにあるときにサウンドを再生しない。なにか提案を?
Sagar Nayak

13

これを試して:

public void ringtone(){
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
     } catch (Exception e) {
         e.printStackTrace();
     }
}

9

あなたの質問から久しぶりですが...オーディオストリームタイプを設定してみましたか?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

準備する前に行う必要があります。


2

ほぼ同じ質問がありました。いくつか調査した結果、デフォルトのシステム「通知音」を再生したい場合は、通知を表示してデフォルトの音を使用するように指示する必要があると思います。また、他のいくつかの回答では、通知音を鳴らしている場合は通知メッセージも表示する必要があるという議論については、何か言わなければならないことがあります。

ただし、通知APIを少し調整することで、必要なものに近づけることができます。空白の通知を表示して、数秒後に自動的に削除することができます。これでうまくいくと思います。多分それはあなたのために働くでしょう。

次のcom.globalmentor.android.app.Notifications.javaような通知音を作成できる便利なメソッドのセットを作成しました。

Notifications.notify(this);

LEDも点滅し、バイブレーション許可があるとバイブレーションが発生します。はい、通知アイコンが通知バーに表示されますが、数秒後に消えます。

この時点で、とにかく通知が消えるので、通知バーにスクロールティッカーメッセージが表示されることにも気付くでしょう。あなたはこのようにそれを行うことができます:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

このクラスには、他にも多くの便利なメソッドがあります。ライブラリ全体をSubversionリポジトリからダウンロードして、Mavenでビルドできます。Mavenでビルドおよびインストールできるglobalmentor-coreライブラリに依存します。


これは、サウンドを再生するだけの複雑な方法です。あなたはこれを行うことができます:stackoverflow.com/a/9622040/1417267
slinden77


1

「通知音」という概念は、Android UIにとってはどこか間違っていると思います。

Androidの予想される動作は、標準の通知を使用してユーザーに警告することです。ステータスバーアイコンなしで通知音を再生すると、ユーザーは混乱します(「その音は何でしたか。ここにアイコンがありません。聴覚に問題がありますか?」)。

通知の音を設定する方法は、たとえば、次のとおりです。通知の音を設定する


1
実際には、これはアプリ内通知の可能性があります。たとえば、チャットアプリを使用していて、着信メッセージと発信メッセージのサウンド効果が小さい場合などです。これらは本質的に通知であり、電話がサイレントモードのときにそれらをシャットダウンする必要があります。
copolii 2011

まあ、あなたは正しいですが、それは別のことです。私は(システムの通知音)について話していました(これが質問のトピックであると想定しています)。つまり、システムのAndroid GUIにあります。もちろん、あなた自身のアプリにいるとき、あなた次第です。
think01

1
Intent intent = new Intent(this, MembersLocation.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("type",type);
    intent.putExtra("sender",sender);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
   // Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(type.equals("emergency"))
    {
        playSound=Emergency_sound_uri;
    }
    else
    {
        playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
    }

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSound(playSound, AudioManager.STREAM_NOTIFICATION)
                    .setAutoCancel(true)
                    .setColor(getColor(R.color.dark_red))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent);

   // notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_HIGH);
        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();
        channel.setSound(Emergency_sound_uri, att);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }

    if (notificationManager != null) {
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

1
このコードスニペットをありがとうございます。このコードスニペットは、限られた、即時のヘルプを提供する可能性があります。適切な説明が大幅にこれは問題に良い解決策であり、他、同様の質問を将来の読者にそれがより便利になるだろう、なぜ示すことによって、その長期的な価値を向上させるであろう。回答を編集して、仮定を含めて説明を追加してください。
NOhs '15 / 03/18

0

通知チャネルにサウンドを設定します

        Uri alarmUri = Uri.fromFile(new File(<path>));

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        channel.setSound(alarmUri, attributes);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.