¿Cómo detengo el tono de llamada actual?

Estoy escribiendo una aplicación que a veces dispara recordatorios que se supone que deben tocar tonos de llamada. Puedo iniciar el tono de llamada OK, pero no puedo detenerlo. Tengo un método de descarte en mi fragmento que debe detener el tono de llamada actual y cerrar la actividad, pero no funciona bien. Esto es lo que hace:

RingtoneManager ringMan = new RingtoneManager(getActivity()); ringMan.stopPreviousRingtone(); getActivity().finish(); 

El método se ejecuta y la actividad se cierra, pero el tono de llamada sólo sigue jugando. ¿Qué estoy haciendo mal?

Razón por la cual stopPreviousRingtone () no está deteniendo el tono de llamada

Encontré que sólo es posible detener un tono de llamada utilizando RingtoneManager.stopPreviousRingtone() sólo si el Ringtone fue creado por la misma instancia de RingtoneManager . Una manera fácil de confirmar esto es crear una actividad con un RingtoneManager y tres botones:

  1. Al hacer clic en el primer botón, se utilizará el RingtoneManager para iniciar un tono de llamada.
  2. Al hacer clic en el segundo botón se llamará stopPreviousRingtone() en el RingtoneManager .
  3. Al hacer clic en el tercer botón se llamará stopPreviousRingtone() en la instancia de RingtoneManager completamente diferente.

Después de hacer esto, debe encontrar que el tono de llamada sólo se detendrá si hace clic en el segundo botón.

Detención de un tono si tiene acceso a la instancia del tono original

Si tiene acceso a la instancia del Ringtone original, simplemente puede llamar al método stop() :

 Ringtone ringtone = RingtoneManager.getRingtone(getActivity()); ringtone.play(); ... ringtone.stop(); 

No es posible detener los tonos cuando se mantiene una referencia al tono original

Lo que podría intentar es crear un servicio que se cargue y reproduzca el tono de llamada cuando se inició y se detendrá el tono de llamada cuando se destruyó. Aquí hay un ejemplo:

 public class RingtonePlayingService extends Service { private Ringtone ringtone; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Uri ringtoneUri = Uri.parse(intent.getExtras().getString("ringtone-uri")); this.ringtone = RingtoneManager.getRingtone(this, ringtoneUri); ringtone.play(); return START_NOT_STICKY; } @Override public void onDestroy() { ringtone.stop(); } } 

A continuación, puede iniciar el tono de llamada en segundo plano con sólo iniciar el servicio:

 Intent startIntent = new Intent(context, RingtonePlayingService.class); ringtoneServiceStartIntent.putExtra("ringtone-uri", ringtoneUri); context.startService(startIntent); 

Y, para detener el tono de llamada, simplemente detenga el servicio:

 Intent stopIntent = new Intent(context, RingtonePlayingService.class); context.stopService(stopIntent); 

Tienes que crear una clase que se extiende desde la clase de servicio, el código de demostración se da a continuación

Tenga en cuenta que esta es la forma de código de mi proyecto de la universidad, es para iniciar la alarma por defecto usar el tono de BroadcastReciever extender la actividad y detener el tono de diferentes actividades normales de Android.

Código de clase de servicio:

 import android.app.Service; import android.content.Intent; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.IBinder; public class AlarmRing extends Service { static Ringtone r; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { //activating alarm sound Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); r = RingtoneManager.getRingtone(getBaseContext(), notification); //playing sound alarm r.play(); return START_NOT_STICKY; } @Override public void onDestroy() { r.stop(); } } 

Código de Actividad que llama al Servicio:

 Intent i = new Intent(context, AlarmRing.class); context.startService(i); 

Actividad que termina o cierra el Servicio:

 Intent i = new Intent(this, AlarmRing.class); stopService(i);` 

NOTA: tenga en cuenta para referencia de contexto.

Crear objeto RingtoneManager utilizando el contexto de aplicación como este

 RingtoneManager ringMan = new RingtoneManager(getApplicationContext()); ringMan.stopPreviousRingtone(); 

Y el objeto RingTone también crean de esta manera solamente.

 mRingTome = RingtoneManager.getRingtone(getApplicationContext(), notification); mRingTome.play(); 

Está funcionando para mí.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.