Android에서 벨소리 / 알람 소리를 재생하는 방법


119

Android에서 벨소리 / 알람 사운드를 재생하는 방법을 어디에서나 찾고있었습니다.

버튼을 누르고 벨소리 / 알람 소리를 재생하고 싶습니다. 쉽고 간단한 샘플을 찾을 수 없었습니다. 예, 이미 알람 시계 소스 코드를 살펴 보았지만 간단하지 않고 컴파일 할 수 없습니다.

나는이 일을 할 수 없다 :

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(this, alert);
final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
    player.setAudioStreamType(AudioManager.STREAM_ALARM);
    player.setLooping(true);
    player.prepare();
    player.start();
}

이 오류가 발생합니다.

04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn't open fd for
content://settings/system/ringtone

그래서 .. 누군가가 기본 벨소리 / 알람을 재생하는 방법을 알고 있으면 알려주세요.

어떤 파일도 업로드하고 싶지 않습니다. 기본 벨소리 만 재생하면됩니다.

답변:


186

다음과 같이 간단히 설정된 벨소리를 재생할 수 있습니다.

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();

여전히 오류가 발생합니다. 벨소리 콘텐츠를 열지 못했습니다. : // settings / system / alarm_alert
Pritesh Desai

3
멋지고 간단합니다. 그러나 기기에 따라이 방법은 Android에서 재생 될 수있는 다른 사운드 (예 : 음악)를 방해 할 수 있습니다.
igordc 2013

getApplicationContext ()를 사용하는 것은 좋은 옵션이 아닐 수 있습니다. 여기에 더 많은 정보 : stackoverflow.com/questions/9122627/...
사켓

@BartSimpson 방법 u는 문제 메신저이 오류지고 해결
user3233280

1
벨소리는 멈출 수 없습니다. 벨소리를 다시 시작하면 두 번 재생됩니다. stopPrevious는 작동하지 않습니다. 그런데 getapplicationcontext가 아닌 동일한 컨텍스트 개체로 벨소리 플레이어를 만듭니다.
Metehan Toksoy 2015

65

사용자가 전화기에 알람을 설정하지 않은 경우 TYPE_ALARM은 null을 반환 할 수 있습니다. 이를 다음과 같이 설명 할 수 있습니다.

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

if(alert == null){
    // alert is null, using backup
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    // I can't see this ever being null (as always have a default notification)
    // but just incase
    if(alert == null) {  
        // alert backup is null, using 2nd backup
        alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);                
    }
}

1
반환 된 URI null는 유효한 사운드를 가리 키지 않더라도 아닐 수 있습니다 . 의 반환 값 RingtoneManager.getRingtone()null대신 테스트해야 합니다.
Attila

2017 년에는 작동하지 않고 울리지 않습니다. 최근 Android에서 작동합니까?

55

이것이 내가 한 방식입니다.

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();

markov00의 방식과 유사하지만 이미 백그라운드에서 재생되고있을 수있는 음악과 같은 다른 사운드를 방해하는 것을 방지하는 벨소리 대신 MediaPlayer를 사용합니다.


5
상위 답변 (ringtone.play)을 시도했지만 소리가 잘릴 수 있습니다. 이 접근 방식을 사용했고 완벽하게 작동했습니다.
wyz

1
앱에서 다른 오디오 구성 요소를 사용하는 모든 사람에게 더 나은 솔루션입니다.
EntangledLoops

@YumYumYum, 방금 테스트했고 작동합니다. 나는 위의 코드를 내 setOnClickListner에 넣는 것 외에 아무것도하지 않았습니다. 뭐 했어?
장편 하늘

17

귀하의 예는 기본적으로 내가 사용하는 것입니다. 그러나 에뮬레이터에서는 기본적으로 벨소리 content://settings/system/ringtone가 없으며 재생 가능한 것으로 확인되지 않기 때문에 에뮬레이터에서는 작동하지 않습니다 . 내 실제 전화에서 잘 작동합니다.


11

이것은 잘 작동합니다.

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
MediaPlayer thePlayer = MediaPlayer.create(getApplicationContext(), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

try {
    thePlayer.setVolume((float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) / 7.0)),
                        (float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) / 7.0)));
} catch (Exception e) {
    e.printStackTrace();
}

thePlayer.start();

2
볼륨을 7.0으로 나누는 이유는 무엇입니까? 일반적으로 알려진 작업 가치입니까, 아니면 스스로 파헤치는 것입니까?
ErGo_404

D : 뭔가 내가 ... 파낸
캄란 아메드

왜 Float.parseFloat (Double.toString (....))을합니까 ?? double-> float 변환을 원하기 때문에 String 인스턴스를 통과합니까? 왜 이렇게합니까?
Zordid

1
이 부분은 중복 Uri.parse이 (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri ()가 이미 URI를 반환 할 필요가 다른 URI에 아직 분석하지 않는 것입니다
DritanX

1
7은 stram의 최대 볼륨입니다
Leo Droidcoder

11

미래의 Google 사용자를 위해 : RingtoneManager.getActualDefaultRingtoneUri()대신 RingtoneManager.getDefaultUri(). 이름대로 실제 uri를 반환하므로 자유롭게 사용할 수 있습니다. 문서에서 getActualDefaultRingtoneUri():

현재 기본 사운드의 Uri를 가져옵니다. 이것은 실제 사운드 Uri를 제공합니다. 이것을 사용하는 대신 대부분의 클라이언트는 DEFAULT_RINGTONE_URI를 사용할 수 있습니다.

한편 getDefaultUri()이렇게 말합니다.

특정 유형의 기본 벨소리에 대한 Uri를 반환합니다. 실제 벨소리의 소리 Uri를 반환하는 대신재생시 실제 사운드로 해석되는 상징적 Uri를.


9

DDMS를 사용하여 / sdcard 폴더에 MP3 파일을 푸시하고 에뮬레이터를 다시 시작한 다음 미디어 애플리케이션을 열고 MP3 파일을 찾은 다음 길게 누르고 "전화 벨소리로 사용"을 선택할 수 있습니다.

오류가 사라졌습니다!

편집 : Ringdroid 응용 프로그램을 사용하여 해결 된 알림 소리 (예 : SMS)와 동일한 문제


4
public class AlarmReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
        //this will update the UI with message
        Reminder inst = Reminder.instance();
        inst.setAlarmText("");

        //this will sound the alarm tone
        //this will sound the alarm once, if you wish to
        //raise alarm in loop continuously then use MediaPlayer and setLooping(true)
        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alarmUri == null) {
            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
        }
        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
        ringtone.play();

        //this will send a notification message
        ComponentName comp = new ComponentName(context.getPackageName(),
                AlarmService.class.getName());
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

어디에서 AlarmService왔습니까?
Eduardo Wada

2

오디오 파일을 에뮬레이터의 sd 카드에 복사하고 미디어 플레이어를 통해 기본 벨소리로 선택하면 실제로 문제가 해결됩니다.


2

다음 샘플 코드를 사용할 수 있습니다.

Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)

if (ringtoneSound != null) {
    ringtoneSound.play();
}

0

늦었을지 모르지만 누가 그것을 원하는지에 대한이 질문에 대한 새로운 간단한 해결책이 있습니다.
Kotlin에서

val player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI)
player.start()

위의 코드는 기본 벨소리를 재생하지만 기본 알람을 원할 경우 변경

Settings.System.DEFAULT_RINGTONE_URI

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

다음은 몇 가지 샘플 코드입니다.

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();

약간의 설명과 함께 코드를 설명하십시오. 코드 전용 답변은 인정되지 않습니다.
Sulthan Allaudeen

어서, 당신은 아마 위의 대답을 읽지 않았을 것입니다. stackoverflow.com/a/20177743/3332634
yshahak

1
이것은 기본적 으로이 대답 과 동일 하지만 mediaPlayer대신 변수 이름 이 mp있습니다.
Makyen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.