2011-12-06 10 views
5

En mi aplicación de Android, estoy tratando de reproducir el tono de llamada predeterminado actual en la creación de mi actividad. Pero el tono de llamada no solo se reproducirá por completo y se detendrá en una longitud arbitraria cada vez.Reproducir un tono de llamada de una actividad se detiene abruptamente

El código es tan simple como podría ser, cualquier ayuda sería apreciada.

Uri currentUri = RingtoneManager.getActualDefaultRingtoneUri(this.context, 
    RingtoneManager.TYPE_RINGTONE); 
Ringtone ringtone = RingtoneManager.getRingtone(this.context,currentUri); 
if (ringtone != null){ 
    ringtone.play(); 
} 
+0

tengo el mismo problema, volverá si encuentro una solución. – cYrixmorten

Respuesta

0

Estoy usando TYPE_NOTIFICATION pero, aparte de eso, mi código era más o menos exactamente el mismo.

me encontré con que la reproducción del sonido dentro de un nuevo Handler ayudaron en mi caso:

 Uri currentUri = RingtoneManager.getActualDefaultRingtoneUri(
       this.context, RingtoneManager.TYPE_RINGTONE); 
     final Ringtone ringtone = RingtoneManager.getRingtone(this.context, 
       currentUri); 
     if (ringtone != null) { 
      new Handler().post(new Runnable() { 

       @Override 
       public void run() { 
        ringtone.play(); 
       } 
      }); 
     } 

¿Por qué esto resuelve el problema?

Creo que el RingtoneManager puede usar el subproceso UI para reproducir el sonido, por lo que si el subproceso UI se usa para crear/dibujar vistas o hacer cálculos al mismo tiempo que se reproduce el sonido, corre el riesgo de ser interrumpido.

Al utilizar un nuevo controlador, la reproducción se pone en cola hasta después de las otras operaciones, dejando el sonido ininterrumpido.

Al menos esa es mi percepción: What exactly does the post method do?

0

que tenían el mismo problema y por encima de respuesta no funcionó en mi caso.

Pero el tono trabajó normalmente en la notificación por lo que hizo una notificación (sin contenido)

Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     NotificationCompat.Builder mBuilder; 
     mBuilder = 
       new NotificationCompat.Builder(this) 
       .setSound(alarmSound) 
       .setVibrate(new long[]{1000,1000}); 

     mNotificationManager.notify(ANY_INT_WILL_DO_HERE, mBuilder.build()); 

funcionó en mi caso. Espero que esto funcione para ti también.

Pero no estoy seguro si lo hace ningún daño si hago esta falsa notificación sólo por jugar tono

Cuestiones relacionadas