IT박스

안드로이드에서 벨소리 / 알람 사운드를 재생하는 방법

itboxs 2020. 7. 26. 12:40
반응형

안드로이드에서 벨소리 / 알람 사운드를 재생하는 방법


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

DDMS를 사용하여 / sdcard 폴더에서 MP3 파일을 푸시하고 에뮬레이터를 다시 시작한 다음 미디어 응용 프로그램을 열고 MP3 파일을 찾아서 길게 눌러 "전화 벨소리로 사용"을 선택할 수 있습니다.

오류가 사라졌습니다!

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


For the future googlers: use RingtoneManager.getActualDefaultRingtoneUri() instead of RingtoneManager.getDefaultUri(). According to its name, it would return the actual uri, so you can freely use it. From documentation of getActualDefaultRingtoneUri():

Gets the current default sound's Uri. This will give the actual sound Uri, instead of using this, most clients can use DEFAULT_RINGTONE_URI.

Meanwhile getDefaultUri() says this:

Returns the Uri for the default ringtone of a particular type. Rather than returning the actual ringtone's sound Uri, this will return the symbolic Uri which will resolved to the actual sound when played.


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

Copying an audio file to the sd card of the emulator and selecting it via media player as the default ringtone does indeed solve the problem.


You could use this sample code:

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

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

Here's some sample code:

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

참고URL : https://stackoverflow.com/questions/2618182/how-to-play-ringtone-alarm-sound-in-android

반응형