tonos - Android: guarde el sonido como tono de llamada y notificación
tonos de llamada (3)
Estoy guardando un sonido de mi aplicación para usarlo como tono de llamada o como sonido de notificación. Aquí hay una parte de mi código, tomado de esta página:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, soundName);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");
values.put(MediaStore.Audio.Media.ARTIST, "artist");
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
values.put(MediaStore.Audio.Media.IS_ALARM, true);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
this.getContentResolver().insert(uri, values);
Tengo entendido que el sonido se guardará, así como un tono de llamada, un sonido de notificación y una alarma, ya que las banderas están configuradas como "verdaderas". Al menos en el emulador, esto funciona, pero en el dispositivo real, el sonido solo aparece en la lista de tonos de llamada, y no tengo idea de por qué.
EDITAR: He intentado investigar más a fondo: eliminar la línea con "IS_RINGTONE" no cambiará nada (en caso de que solo se pueda usar una bandera a la vez), el sonido no aparece en la lista con la notificación- sonidos.
Cualquier ayuda es apreciada.
Saludos cordiales, Select0r
Debe examinar la API del reproductor multimedia en Android ieandroid.media.MediaPlayer; android.media.MediaPlayer.OnCompletionListener. Aquí está: http://developer.android.com/reference/android/media/package-summary .... Y así es como se reproduce un sonido al disparar un clic oyente:
private OnClickListener btnDontBeStupidListener = new
OnClickListener()
{
public void onClick(View v)
{
//Toast.makeText(getBaseContext(), "Don''t Be Stupid audio file
is being played", Toast.LENGTH_SHORT).show();
final MediaPlayer mp = MediaPlayer.create(iMEvil.this,
R.raw.stupid);
//mp.start();
try {
mp.start();
//mp.release();
}catch(NullPointerException e){
Log.v("MP error", e.toString());
}
mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
}
});
}
};
Además, ¿has intentado grabar el sonido mientras lo tocas? Pruébalo y ve si funciona.
¿Ayuda si intentas cambiar de MediaStore.Audio.Media a AudioColumns? Me gusta esto:
values.put(AudioColumns.ARTIST, "artist");
values.put(AudioColumns.IS_RINGTONE, true);
values.put(AudioColumns.IS_NOTIFICATION, true);
values.put(AudioColumns.IS_ALARM, true);
values.put(AudioColumns.IS_MUSIC, false);
La referencia no dice que MediaStore.Audio.Media está en desuso, pero creo que AudioColumns se usa ahora. Lo estoy usando en mi aplicación y parece funcionar.
Jugué con la ruta para resolver esto y aquí está la solución que se me ocurrió hasta ahora:
En el emulador, la ruta no importa, el sonido aparecerá en el tono de llamada y en la lista de notificaciones.
En el teléfono, el sonido mostrará la lista de tonos de llamada si el archivo se guarda en /media/audio/ringtones
OR /media/audio/
pero NO como una notificación.
Si uso la ruta /media/audio/notifications
el sonido finalmente aparece en la lista de notificaciones (!) Pero NO en los tonos de llamada.
¿Entonces parece que tengo que guardar el sonido dos veces para incluirlo en ambas listas? (Pero ¿por qué guardarlo una vez funciona en el emulador?)
Si hay otra forma de obtener sonidos en ambas listas (o incluso en tres listas, también hay tonos de alarma, simplemente no me molesté en jugar con ellos) con solo guardarlos una vez, por favor avíseme. (En este momento, mi solución alternativa es un diálogo para permitir al usuario elegir si desea guardar el sonido como un tono de llamada o una notificación).