Come riprodurre suonerie / suonerie su Android


119

Ho cercato ovunque come riprodurre un suono di suoneria / sveglia su Android.

Premo un pulsante e voglio riprodurre una suoneria / un suono di allarme. Non sono riuscito a trovare un campione semplice e diretto. Sì, ho già esaminato il codice sorgente di Alarm clock ... ma non è semplice e non posso compilarlo.

Non riesco a farlo funzionare:

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

Ottengo questo errore:

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

Quindi ... per favore, se qualcuno sa come riprodurre una suoneria / sveglia predefinita, fammelo sapere.

Preferisco non caricare alcun file. Riproduci solo una suoneria predefinita.

Risposte:


186

Puoi semplicemente riprodurre una suoneria impostata con questo:

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

Ricevo ancora un errore - Impossibile aprire il contenuto della suoneria: // settings / system / alarm_alert
Desai

3
Bello e semplice. Tuttavia, a seconda del dispositivo, questo metodo potrebbe interrompere altri suoni (come la musica) che potrebbero essere riprodotti su Android.
igordc

L'uso di getApplicationContext () potrebbe non essere una buona opzione. Maggiori informazioni qui: stackoverflow.com/questions/9122627/…
Saket

@BartSimpson come hai risolto il problema, ho anche ricevuto questo errore
user3233280

1
La suoneria non può essere interrotta. Se ricomincia la suoneria, suona il doppio. stopPrevious non funziona, tra l'altro creo suonerie con lo stesso oggetto contesto, non getapplicationcontext.
Metehan Toksoy

65

Se un utente non ha mai impostato una sveglia sul proprio telefono, TYPE_ALARM può restituire null. Puoi spiegare questo con:

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
L'URI restituito potrebbe non essere nullanche se non punta a un suono valido. Dovresti testare il valore di ritorno di RingtoneManager.getRingtone()per nullinvece / pure
Attila

Nel 2017 non funzionava non suonando. Funziona con Android recente?

55

Questo è il modo in cui ho fatto:

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

È simile al modo di markov00, ma utilizza MediaPlayer invece di Ringtone che impedisce di interrompere altri suoni, come la musica, che potrebbe già essere riprodotta in sottofondo.


5
Ho provato la risposta migliore (ringtone.play) ma il suono potrebbe essere interrotto. Ho usato questo approccio e ha funzionato perfettamente.
wyz

1
Questa è una soluzione migliore per chiunque utilizzi altri componenti audio nella propria app.
EntangledLoops

@YumYumYum, ho appena provato e funziona. Non ho fatto altro che inserire il codice sopra nel mio setOnClickListner. Che cosa hai fatto?
feature sky il

17

Il tuo esempio è fondamentalmente quello che sto usando. Non funziona mai sull'emulatore, tuttavia, perché l'emulatore non ha suonerie per impostazione predefinita e content://settings/system/ringtonenon risolve nulla di riproducibile. Funziona bene sul mio telefono attuale.


11

Funziona bene:

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
Perché stai dividendo il volume per 7.0? È un valore lavorativo comunemente noto o qualcosa che riesci a scavare da solo?
ErGo_404

Qualcosa che ho tirato fuori ...: D
Kamran Ahmed

Perché esegui Float.parseFloat (Double.toString (....)) ?? Stai passando attraverso un'istanza String perché vuoi una conversione double-> float? Perchè fai questo?
Zordid

1
Questa parte è ridondante Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () restituisce già un URI, non è necessario analizzarlo ancora in un altro URI
DritanX

1
7 è un volume massimo per lo stram
Leo Droidcoder

11

Per i futuri googler: usa RingtoneManager.getActualDefaultRingtoneUri()invece di RingtoneManager.getDefaultUri(). Secondo il suo nome, restituirebbe l'uri effettivo, quindi puoi usarlo liberamente. Dalla documentazione di getActualDefaultRingtoneUri():

Ottiene Uri del suono predefinito corrente. Questo darà il suono reale Uri, invece di usarlo, la maggior parte dei client può usare DEFAULT_RINGTONE_URI.

Intanto getDefaultUri()dice questo:

Restituisce l'Uri per la suoneria predefinita di un tipo particolare. Invece di restituire il suono della suoneria reale Uri, questo restituirà l' Uri simbolico che verrà risolto nel suono effettivo quando viene riprodotto.


9

Puoi inserire un file MP3 nella cartella / sdcard utilizzando DDMS, riavviare l'emulatore, quindi aprire l'applicazione Media, cercare il file MP3, premere a lungo su di esso e selezionare "Usa come suoneria del telefono".

L'errore è andato!

Modifica: stesso problema con i suoni di notifica (ad esempio per gli SMS) risolto utilizzando l'applicazione Ringdroid


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

da dove AlarmServiceviene?
Eduardo Wada,

2

Copiare un file audio sulla scheda sd dell'emulatore e selezionarlo tramite lettore multimediale come suoneria predefinita risolve effettivamente il problema.


2

Puoi usare questo codice di esempio:

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

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

0

Potrebbe essere tardi, ma c'è una nuova semplice soluzione a questa domanda per chi lo vorrà.
In kotlin

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

Il codice sopra riprodurrà la suoneria predefinita, ma se vuoi la sveglia predefinita, cambia

Settings.System.DEFAULT_RINGTONE_URI

per

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

Ecco alcuni esempi di codice:

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

Spiega il codice con una piccola spiegazione, le risposte solo in codice non sono apprezzate.
Sulthan Allaudeen

Andiamo amico, probabilmente non hai mai letto le risposte sopra. stackoverflow.com/a/20177743/3332634
yshahak

1
Questo è fondamentalmente identico a questa risposta , ma con il nome della variabile mediaPlayerinvece di mp.
Makyen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.