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.
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.
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.
Nuestra aplicación necesitará los siguientes permisos:
android.permission.READ_PHONE_STATE
para detectar llamadas entrantesandroid.permission.WRITE_SETTINGS
para cambiar la configuración de tono de llamada predeterminadaandroid.permission.READ_EXTERNAL_STORAGE
para obtener la lista de tonos de llamada disponiblesAgregue 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
.
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:
los Actividad
Necesita las siguientes vistas:
Botón de activación
para activar / desactivar el aleatorizador de tono de llamadaVista de la lista
para mostrar todos los tonos de llamada disponiblesVista de texto
que actúa como una etiquetaCrea 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..
Tono de llamada
Clase de ayudaPara 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úblicafetchAvailableRingtones (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 laRingtoneManager
clase. losRingtoneManager
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 enTYPE_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 alObtén el tono del timbre
método en unpara
bucle, añadiendo cada tono de llamada atonos 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 elAleatorio
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 lasetActualDefaultRingtoneUri
método para cambiar el tono de llamada.6. Crear receptor de difusión
Crear una nueva clase llamada
RingReceiver
que hereda deReceptor de radiodifusión
. La nueva clase tendrá un solo método llamadoonReciba
. En este método, todo lo que hacemos es llamar a la clase auxiliarcambioRingono
Método si se cumplen los siguientes criterios:
- La acción de los recibidos.
Intención
es igual aTelephonyManager.ACTION_PHONE_STATE_CHANGED
- el valor de la clave de búsqueda
EXTRA_STATE
es igual aTelephonyManager.EXTRA_STATE_RINGING
Esto es lo que el
RingReceiver
la clase debe verse comola 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 deActividad
. Anulamos elonCreate
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 unLista
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 privadatonos 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 unabooleano
valor nombrado activo enPreferencias compartidas
. Este valor se establece enfalso
por defecto.También agregamos un
OnCheckedChangeListener
al botón de alternar para actualizar el valor enPreferencias compartidas
. losputBoolean
ycometer
métodos de laEditor
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 unAdaptador
basado en elLista
de tonos de llamada. Utilizarandroid.R.layout.simple_list_item_1
como el diseño de los elementos de laVista de la lista
. No es más que unVista de texto
. Debe mostrar el título del tono de llamada, usando elTono de llamada
claseGetTitle
método. Esto debe hacerse dentro de lagetView
método de laAdaptador
, después de anularlo.Una vez el
Adaptador
esta listo, asignalo alVista de la lista
usando elVista de la lista
essetAdapter
método.private void initializeList () ArrayAdapteradaptador = 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 elRingtoneManager
clase.