Crear un tono aleatorio en Android

Los usuarios de Android siempre están buscando aplicaciones que puedan alterar el comportamiento de sus dispositivos de maneras nuevas e innovadoras. La plataforma Android le da a sus desarrolladores mucha libertad para construir tales aplicaciones. En este tutorial, aprenderá cómo crear una aplicación que aleatoriza el tono de llamada de un teléfono Android cada vez que recibe una llamada.

Prerrequisitos

Si desea seguirlo, asegúrese de tener instalada la última versión de Android Studio. Puedes obtenerlo desde el sitio web del desarrollador de Android.

Debido a que este es un tutorial intermedio, no cubriré los conceptos básicos con demasiados detalles. Supongo que ya ha creado una o más aplicaciones de Android y está familiarizado con los conceptos básicos del SDK de Android.

1. Crear un nuevo proyecto

Inicia Android Studio y crea un nuevo proyecto. Establece el nombre de la aplicación en RingtoneRandomizer. Asegúrese de elegir un nombre de paquete único.

Esta aplicación puede ejecutarse en todos los teléfonos que tengan un nivel de API 8 o superior, así que configure el SDK mínimo a Android 2.2.

A continuación, elija Añadir ninguna actividad y haga clic Terminar.

2. Editar Manifiesto

Nuestra aplicación necesitará los siguientes permisos:

  • android.permission.READ_PHONE_STATE para detectar llamadas entrantes
  • android.permission.WRITE_SETTINGS para cambiar la configuración de tono de llamada predeterminada
  • android.permission.READ_EXTERNAL_STORAGE para obtener la lista de tonos de llamada disponibles

Agregue lo siguiente a AndroidManifest.xml:

  

Esta aplicación tiene una Actividad, para permitir al usuario activar / desactivar el comportamiento de cambio de tono de llamada.

     

También tiene un Receptor de radiodifusión para detectar cambios en el estado de la llamada. Como se muestra a continuación, la acción de intención que escucha es android.intent.action.PHONE_STATE.

    

3. Editar cadenas.xml

los strings.xml archivo contiene las cadenas que utiliza la aplicación. Actualizar valores / cadenas.xml Como se muestra abajo:

  Tono aleatorio Activar tono aleatorio Desactivar tono aleatorio Tonos de llamada disponibles en este dispositivo: 

4. Crear el diseño de la actividad

los Actividad Necesita las siguientes vistas:

  • una Botón de activación para activar / desactivar el aleatorizador de tono de llamada
  • una Vista de la lista para mostrar todos los tonos de llamada disponibles
  • una Vista de texto que actúa como una etiqueta

Crea un archivo llamado layout / activity_main.xml y reemplazar su contenido con lo siguiente. Como puede ver, el diseño es bastante simple y directo..

     

5. Crear Tono de llamada Clase de ayuda

Para evitar tratar con el RingtoneManager directamente en el Actividad o la Receptor de radiodifusión, Vamos a crear una clase de ayuda llamada Tono de llamada.

clase pública RingtoneHelper 

los Tono de llamada clase tendrá dos métodos estáticos que hacen uso de la RingtoneManager clase.

fetchAvailableRingtones

los fetchAvailableRingtones método recupera la lista de tonos de llamada disponibles, devolviendo un Lista de Tono de llamada objetos.

Lista estática pública fetchAvailableRingtones (contexto de contexto) List ringtones = new ArrayList <> (); RingtoneManager mgr = new RingtoneManager (contexto); mgr.setType (RingtoneManager.TYPE_RINGTONE); int n = mgr.getCursor (). getCount (); para (int i = 0; i

En fetchAvailableRingtones método, comenzamos creando una instancia de la RingtoneManager clase. los RingtoneManager El objeto puede enumerar todos los sonidos disponibles en el dispositivo. Esto incluye los sonidos para alarmas y otras notificaciones..

Usamos el setType método para establecer su tipo en TYPE_RINGTONE Como solo nos interesan los tonos de llamada..

Entonces invocamos el getCount Método para saber cuántos tonos de llamada están disponibles y llamar al Obtén el tono del timbre método en un para bucle, añadiendo cada tono de llamada a tonos de llamada.

cambioRingono

los cambioRingono El método es responsable de cambiar el tono de llamada del dispositivo, la función principal de nuestra aplicación..

público void changeRingtone (contexto de contexto) SharedPreferences preferences = context.getSharedPreferences ("randomizer", Context.MODE_PRIVATE); if (! preferences.getBoolean ("active", false)) devuelve; RingtoneManager mgr = new RingtoneManager (contexto); Aleatorio aleatorio = nuevo Aleatorio (System.currentTimeMillis ()); int n = random.nextInt (mgr.getCursor (). getCount ()); RingtoneManager.setActualDefaultRingtoneUri (context, RingtoneManager.TYPE_RINGTONE, mgr.getRingtoneUri (n)); 

Primero nos registramos Preferencias compartidas Si el usuario ha activado el aleatorizador de tono de llamada. Entonces usamos el Aleatorio clase para elegir un número aleatorio que sea menor que el número de tonos de llamada disponibles.

los getRingtoneUri Se invoca un método para obtener el URI del tono de llamada correspondiente y pasarlo a la setActualDefaultRingtoneUri método para cambiar el tono de llamada.

6. Crear receptor de difusión

Crear una nueva clase llamada RingReceiver que hereda de Receptor de radiodifusión. La nueva clase tendrá un solo método llamado onReciba. En este método, todo lo que hacemos es llamar a la clase auxiliar cambioRingono Método si se cumplen los siguientes criterios:

  • La acción de los recibidos. Intención es igual a TelephonyManager.ACTION_PHONE_STATE_CHANGED
  • el valor de la clave de búsqueda EXTRA_STATE es igual a TelephonyManager.EXTRA_STATE_RINGING

Esto es lo que el RingReceiver la clase debe verse como

la clase pública RingReceiver extiende BroadcastReceiver @Override public void onReceive (Contexto de contexto, Intención de intención) if (intent.getAction (). es igual a (TelephonyManager.ACTION_PHONE_STATE_CHANGED)) String callState = intent.getStringExtra (TelephonyManager.pañol if (callState.equals (TelephonyManager.EXTRA_STATE_RINGING)) RingtoneHelper.changeRingtone (contexto); 

7. Crear actividad

Crear una nueva clase llamada Actividad principal que hereda de Actividad. Anulamos el onCreate Método y realizar las siguientes acciones:

  • invocar setContentView para utilizar el diseño definido en activity_main.xml
  • llamar a la clase de ayuda fetchAvailableRingtones método para poblar un Lista de tonos de llamada
  • inicializar el Vista de la lista
  • inicializar el Botón de activación

los Actividad principal La clase ahora debería verse algo como esto:

la clase pública MainActivity extiende la actividad private ListView listOfRingtones; privado ToggleButton toggleRandomizer; Lista privada tonos de llamada; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); listOfRingtones = (ListView) findViewById (R.id.list_of_ringtones); toggleRandomizer = (ToggleButton) findViewById (R.id.toggle); ringtones = RingtoneHelper.fetchAvailableRingtones (this); initializeList (); initializeToggle (); 

initializeToggle

En el initializeToggle método establecemos el estado del botón de alternancia basado en una booleano valor nombrado activo en Preferencias compartidas. Este valor se establece en falso por defecto.

También agregamos un OnCheckedChangeListener al botón de alternar para actualizar el valor en Preferencias compartidas. los putBoolean y cometer métodos de la Editor se utilizan para lograr esto.

private void initializeToggle () final SharedPreferences preferences = getSharedPreferences ("randomizer", Context.MODE_PRIVATE); boolean active = preferences.getBoolean ("active", false); toggleRandomizer.setChecked (activo); toggleRandomizer.setOnCheckedChangeListener (nuevo CompoundButton.OnCheckedChangeListener () @Override public void enCheckedChanged (CompoundButton buttonView, boolean) es un checked) 

initializeList

los initializeList método crea un Adaptador basado en el Lista de tonos de llamada. Utilizar android.R.layout.simple_list_item_1 como el diseño de los elementos de la Vista de la lista. No es más que un Vista de texto. Debe mostrar el título del tono de llamada, usando el Tono de llamada clase GetTitle método. Esto debe hacerse dentro de la getView método de la Adaptador, después de anularlo.

Una vez el Adaptador esta listo, asignalo al Vista de la lista usando el Vista de la listaes setAdapter método.

private void initializeList () ArrayAdapter adaptador = nuevo ArrayAdapter(esto, android.R.layout.simple_list_item_1, ringtones) @Override public Ver getView (int position, View convertView, ViewGroup parent) TextView item = (TextView) super.getView (position, convertView, parent); item.setText (ringtones.get (position) .getTitle (MainActivity.this)); Devolver objeto; ; listOfRingtones.setAdapter (adaptador); 

8. Compilar y ejecutar

Nuestra aplicación ahora está lista para ser implementada en un teléfono Android. Debería poder ver todos los tonos de llamada disponibles en su teléfono cuando inicie la aplicación. Haga clic en el botón de alternar para activar el aleatorizador.

Llama a ti mismo desde otro teléfono un par de veces. La primera vez que reciba una llamada, se reproducirá su tono de llamada original. A partir de la próxima llamada, oirás un tono de llamada aleatorio cada vez que.

Tenga en cuenta que esta aplicación cambia el tono de llamada predeterminado de su teléfono. Si ha asignado un tono de llamada específico a un contacto o un grupo de contactos, ese tono de llamada aún se utilizará.

Conclusión

Ya sabe cómo hacer uso de la funcionalidad disponible en el RingtoneManager clase. También has aprendido a detectar llamadas entrantes. Siéntase libre de aprovechar esta aplicación para aleatorizar otras notificaciones de una manera similar. Visite el sitio web de Android Developer para obtener más información sobre el RingtoneManager clase.