Crea un Randomizer suoneria su Android

Gli utenti Android sono sempre alla ricerca di app in grado di modificare il comportamento dei propri dispositivi in ​​modi nuovi e innovativi. La piattaforma Android offre ai suoi sviluppatori molta libertà per creare tali app. In questo tutorial, imparerai come creare un'app che renda casuale la suoneria di un telefono Android ogni volta che riceve una chiamata.

Prerequisiti

Se desideri proseguire, assicurati di aver installato l'ultima versione di Android Studio. Puoi scaricarlo dal sito web degli sviluppatori Android.

Poiché questo è un tutorial intermedio, non tratterò le basi in troppi dettagli. Presumo che tu abbia già creato una o più app Android e conosca le basi dell'SDK di Android.

1. Crea un nuovo progetto

Avvia Android Studio e crea un nuovo progetto. Impostare il nome dell'applicazione su RingtoneRandomizer. Assicurati di scegliere un nome di pacchetto univoco.

Questa app può essere eseguita su tutti i telefoni con livello API 8 o superiore, quindi imposta l'opzione SDK minimo a Android 2.2.

Quindi, scegliere Aggiungi Nessuna Attività e fare clic finire.

2. Modifica manifesto

La nostra app necessita delle seguenti autorizzazioni:

  • android.permission.READ_PHONE_STATE per rilevare le chiamate in arrivo
  • android.permission.WRITE_SETTINGS per cambiare l'impostazione predefinita della suoneria
  • android.permission.READ_EXTERNAL_STORAGE per recuperare l'elenco delle suonerie disponibili

Aggiungi il seguente a AndroidManifest.xml:

  

Questa app ha uno Attività, per consentire all'utente di attivare / disattivare il comportamento di modifica della suoneria.

     

Ha anche un BroadcastReceiver per rilevare le modifiche dello stato di chiamata. Come mostrato di seguito, l'azione intent che ascolta è android.intent.action.PHONE_STATE.

    

3. Modifica strings.xml

Il strings.xml il file contiene le stringhe utilizzate dall'app. Aggiornare Valori / strings.xml come mostrato di seguito:

  Suoneria Randomizer Attiva Randomizer suoneria Disattiva Randomizer suoneria Suonerie disponibili su questo dispositivo: 

4. Creare il layout delle attività

Il Attività ha bisogno delle seguenti opinioni:

  • un Interruttore per attivare / disattivare il randomizzatore della suoneria
  • un Visualizzazione elenco per visualizzare tutte le suonerie disponibili
  • un TextView che funge da etichetta

Crea un file chiamato layout / activity_main.xml e sostituire il suo contenuto con il seguente. Come puoi vedere, il layout è piuttosto semplice e diretto.

     

5. Crea RingtoneHelper Helper Class

Al fine di evitare di affrontare il RingtoneManager direttamente nel Attività o il BroadcastReceiver, creeremo una classe di supporto chiamata RingtoneHelper.

RingtoneHelper di classe pubblica 

Il RingtoneHelper la classe avrà due metodi statici che fanno uso di RingtoneManager classe.

fetchAvailableRingtones

Il fetchAvailableRingtones metodo recupera l'elenco delle suonerie disponibili, restituendo a Elenco di Suoneria oggetti.

elenco statico pubblico fetchAvailableRingtones (contesto di contesto) List suonerie = nuovo ArrayList <> (); RingtoneManager mgr = new RingtoneManager (context); mgr.setType (RingtoneManager.TYPE_RINGTONE); int n = mgr.getCursor (). getCount (); per (int i = 0; i

Nel fetchAvailableRingtones metodo, iniziamo creando un'istanza di RingtoneManager classe. Il RingtoneManager oggetto può elencare tutti i suoni disponibili sul dispositivo. Ciò include i suoni per gli allarmi e altre notifiche.

Noi usiamo il setType metodo per impostare il suo tipo su TYPE_RINGTONE dato che siamo interessati solo alle suonerie.

Quindi invochiamo il getCount metodo per sapere quante suonerie sono disponibili e chiama il getRingtone metodo in a per loop, aggiungendo ogni suoneria a suonerie.

changeRingtone

Il changeRingtone il metodo è responsabile della modifica della suoneria del dispositivo, la caratteristica principale della nostra app.

public static void changeRingtone (Context context) SharedPreferences preferences = context.getSharedPreferences ("randomizer", Context.MODE_PRIVATE); se (! preferences.getBoolean ("active", false)) restituisce; RingtoneManager mgr = new RingtoneManager (context); Casuale casuale = nuovo Casuale (System.currentTimeMillis ()); int n = random.nextInt (mgr.getCursor (). getCount ()); RingtoneManager.setActualDefaultRingtoneUri (context, RingtoneManager.TYPE_RINGTONE, mgr.getRingtoneUri (n)); 

Il primo check-in SharedPreferences se l'utente ha attivato il randomizzatore della suoneria. Quindi usiamo il Casuale classe per scegliere un numero casuale inferiore al numero di suonerie disponibili.

Il getRingtoneUri il metodo viene invocato per recuperare l'URI della suoneria corrispondente e passarlo a setActualDefaultRingtoneUri metodo per cambiare la suoneria.

6. Crea Ricevitore Broadcast

Crea una nuova classe chiamata RingReceiver che eredita da BroadcastReceiver. La nuova classe avrà un solo metodo chiamato OnReceive. In questo metodo, tutto ciò che facciamo è chiamare la classe helper changeRingtone metodo se sono soddisfatti i seguenti criteri:

  • l'azione del ricevuto Intento è uguale a TelephonyManager.ACTION_PHONE_STATE_CHANGED
  • il valore della chiave di ricerca EXTRA_STATE è uguale a TelephonyManager.EXTRA_STATE_RINGING

Questo è ciò che RingReceiver classe dovrebbe assomigliare:

ringReceiver di classe pubblica estende BroadcastReceiver @Override public void onReceive (Context context, Intent intent) if (intent.getAction (). equals (TelephonyManager.ACTION_PHONE_STATE_CHANGED)) String callState = intent.getStringExtra (TelephonyManager.EXTRA_STATE); if (callState.equals (TelephonyManager.EXTRA_STATE_RINGING)) RingtoneHelper.changeRingtone (context); 

7. Crea attività

Crea una nuova classe chiamata Attività principale che eredita da Attività. Noi scavalchiamo il onCreate metodo ed eseguire le seguenti azioni:

  • invocare setContentView utilizzare il layout definito in activity_main.xml
  • chiama la classe dell'aiutante fetchAvailableRingtones metodo per popolare a Elenco di suonerie
  • inizializza il Visualizzazione elenco
  • inizializza il Interruttore

Il Attività principale la classe dovrebbe ora assomigliare a qualcosa del genere:

public class MainActivity estende Activity list ListView privatoOfRingtones; ToggleButton privato toggleRandomizer; Elenco privato suonerie; @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); suonerie = RingtoneHelper.fetchAvailableRingtones (questo); initializeList (); initializeToggle (); 

initializeToggle

Nel initializeToggle metodo impostiamo lo stato del pulsante di attivazione basato su a booleano valore chiamato attivo nel SharedPreferences. Questo valore è impostato su falso per impostazione predefinita.

Aggiungiamo anche un OnCheckedChangeListener al pulsante di commutazione per aggiornare il valore in SharedPreferences. Il putBoolean e commettere metodi del editore sono usati per realizzare questo.

private void initializeToggle () final SharedPreferences preferences = getSharedPreferences ("randomizer", Context.MODE_PRIVATE); booleano attivo = preferences.getBoolean ("active", false); toggleRandomizer.setChecked (attivo); toggleRandomizer.setOnCheckedChangeListener (new CompoundButton.OnCheckedChangeListener () @Override public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) preferences.edit (). putBoolean ("active", isChecked) .commit ();); 

initializeList

Il initializeList il metodo crea un Adattatore basato sul Elenco di suonerie. Uso android.R.layout.simple_list_item_1 come il layout degli oggetti del Visualizzazione elenco. Non è altro che a TextView. Dovrebbe visualizzare il titolo della suoneria, usando il Suoneria La classe di getTitle metodo. Questo dovrebbe essere fatto all'interno del GetView metodo del Adattatore, dopo averlo scavalcato.

Una volta il Adattatore è pronto, assegnalo al Visualizzazione elenco usando il Visualizzazione elenco'S setAdapter metodo.

private void initializeList () ArrayAdapter adattatore = nuovo ArrayAdapter(questo, android.R.layout.simple_list_item_1, suonerie) @ Override public Visualizza getView (int position, Visualizza convertView, ViewGroup parent) TextView item = (TextView) super.getView (position, convertView, parent); item.setText (ringtones.get (posizione) .getTitle (MainActivity.this)); oggetto di reso; ; listOfRingtones.setAdapter (adattatore); 

8. Compila ed esegui

La nostra app è ora pronta per essere distribuita su un telefono Android. Dovresti essere in grado di vedere tutte le suonerie disponibili sul tuo telefono quando avvii l'app. Fare clic sul pulsante di attivazione / disattivazione per attivare il randomizzatore.

Chiamati da un altro telefono un paio di volte. La prima volta che si riceve una chiamata, verrà riprodotta la suoneria originale. Dalla prossima chiamata in poi, sentirai una suoneria casuale ogni volta.

Nota che questa app cambia la suoneria predefinita del tuo telefono. Se è stata assegnata una suoneria specifica a un contatto oa un gruppo di contatti, tale suoneria verrà comunque utilizzata.

Conclusione

Ora sai come utilizzare le funzionalità disponibili in RingtoneManager classe. Hai anche imparato a rilevare le chiamate in arrivo. Sentiti libero di costruire su questa app per randomizzare altre notifiche in modo simile. Visita il sito Web degli sviluppatori Android per ulteriori informazioni su RingtoneManager classe.