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

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

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

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



답변

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

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


답변

사용자가 전화기에 알람을 설정하지 않은 경우 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);
    }
}


답변

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

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

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


답변

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


답변

이것은 잘 작동합니다.

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();


답변

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

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

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

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


답변

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

오류가 사라졌습니다!

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