안드로이드 알림 사운드를 재생하는 방법


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
예를 들어 Motorola 전화는 환경 설정 활동을 확장하고 사용자가 SMS 및 기타 카테고리에 대한 알림 음을 정의 할 수 있도록합니다. 위의 방법은이 유형의 전화기에서 작동하지 않습니다. 이 문제를 해결하는 방법을 알고 있습니까?
David

2
이 오류가 발생했습니다 : MediaPlayer - Should have subtitle controller already set. 무슨 뜻인가요?
Deqing

이 솔루션을 사용하면 28/29 회 후에 사운드 재생이 중지됩니다. 왜 그 이유를 알고 있습니까?
Tom Brinkkemper

1
왜 모든 예외를 포착합니까? 어느 것이 던져 질 수 있습니까?
Miha_x64

2
@ 샘, 예. stackoverflow.com/q/39876885/2614353 . 기본적으로 재생할 때마다 RingTone 객체를 만들지 마십시오. 한 번 만든 다음 같은 개체를 여러 번 재생하십시오.
Tom 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

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으로 빌드하고 설치할 수도 있습니다.


그것은 단순히 소리를 재생하는 복잡한 방법입니다. : 당신은이 할 수 stackoverflow.com/a/9622040/1417267
slinden77


1

"알림 사운드"의 개념은 안드로이드 UI에서 어쩌면 잘못이라고 생각합니다.

Android에서 예상되는 동작은 표준 알림을 사용하여 사용자에게 알리는 것입니다. 상태 표시 줄 아이콘없이 알림 음을 재생하면 사용자가 혼란스러워집니다 ( "이 소리는 무엇입니까? 여기에는 아이콘이 없습니다. 청각에 문제가 있습니까?").

알림에서 소리를 설정하는 방법은 다음과 같습니다. 알림 소리 설정


1
실제로는 이것이 인앱 알림 일 수 있습니다. 예를 들어 채팅 앱을 사용 중이고 발신 메시지에 작은 음향 효과가있는 경우를 예로들 수 있습니다. 이러한 알림은 본질적으로 알림이며 전화기가 자동 모드 일 때 시스템 종료를 원합니다.
copolii

글쎄, 당신 말이 맞지만 또 다른 것입니다. 나는 시스템 안드로이드 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

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.