Create en ringetone Randomizer på Android 
 24 
 Del 
 6 
 Del 
 Dette Cyber mandag Envato Tuts + Kursene vil bli redusert til bare $ 3. Ikke gå glipp av. 
 
 Android-brukere er alltid på utkikk etter apps som kan endre oppførselen til sine enheter i nye og innovative måter. Android-plattformen gir utviklerne en stor frihet til å bygge slike apps. I denne opplæringen vil du lære hvordan du kan lage en app som randomiserer ringetone fra en Android-telefon hver gang den mottar et anrop. 
 
 Forutsetninger 
 
 Hvis du ønsker å følge sammen, så sørg for at du har den nyeste versjonen av Android Studio installert. Du kan få det fra Android Developer nettstedet. 
 
 Fordi dette er en mellom opplæringen, vil jeg ikke dekke det grunnleggende i for mye detalj. Jeg antar at du allerede har opprettet en eller flere Android-apps og er kjent med det grunnleggende av Android SDK. 
 
 1. Opprett et nytt prosjekt 
 
 Komme Android Studio og opprette et nytt prosjekt. Sett navnet på programmet til RingtoneRandomizer. Pass på at du velger et unikt pakkenavn. 
 
 Denne applikasjonen kan kjøres på alle telefoner som har API nivå 8 eller høyere, så sette minimum SDK til Android 2.2. 
 
 Deretter velger du Legg Nei Aktivitet og klikk Fullfør. 
 
 2. Edit Manifest 
 
 Vår app trenger følgende tillatelser: 
 
 android.permission.READ_PHONE_STATE å oppdage innkommende samtaler 
 
 android.permission.WRITE_SETTINGS å endre standard ringetone Innstillingen 
 
 android.permission.READ_EXTERNAL_STORAGE å hente listen over tilgjengelige ringetoner 
 
 Legg til følgende AndroidManifest.xml: 
 < bruker-tillatelse android: name = "android .permission.READ_PHONE_STATE "/> < bruker-tillatelse android: name =" android.permission.WRITE_SETTINGS "/> < bruker-tillatelse android: name =" android.permission.READ_EXTERNAL_STORAGE "/> 
 Dette app har en aktivitet, for å tillate brukeren å aktivere /deaktivere ringetone endre atferd 
 < aktivitet android. name = ". MainActivity" > < intent-filter > < handling android: name = "android.intent.action.MAIN" /> < kategori android: name = "android.intent.category.LAUNCHER" /> < /intent-filter > < /aktivitets > 
 Det har også en BroadcastReceiver å oppdage samtaletilstandsendringer. Som vist nedenfor, i den hensikt handling som den lytter til er android.intent.action.PHONE_STATE 
 < mottaker android: ".. RingReceiver" name = android: frigitt = "true" > < intent-filter > < handling android: name = "android.intent.action.PHONE_STATE" /> < /intent-filter > < /mottaker > 
 3. Edit strings.xml 
 
 strings.xml filen inneholder strenger app bruker. Oppdater verdier /strings.xml som vist nedenfor:? 
 ≪ xml version = "1.0" encoding = "UTF-8" > < ressurser > < string name = "APP_NAME" > Ringtone Randomizer < /string > < string name = "aktivere" > Aktiver Ringtone Randomizer < /string > < string name = "deaktivere" > Deaktiver Ringtone Randomizer < /string > < string name = "list_of_ringtones" > ringetoner tilgjengelig på denne enheten: < /string > < /ressurser > 
 4. Opprett Aktivitet Layout 
 
 Aktivitets trenger følgende visninger: 
 
 a ToggleButton å aktivere /deaktivere ringetone randomizeren 
 
 en Listview for å vise alle tilgjengelige ringetoner 
 
 a TextView som fungerer som en etikett 
 
 Lag en fil som heter layout /activity_main.xml og erstatte innholdet med følgende. Som du kan se, er ganske enkel og grei 
 < oppsettet; xml version = "1.0" encoding = "UTF-8" > < LinearLayout xmlns:.? Android = "http: //schemas.android.com/apk/res/android "android: orientering =" vertikal "android: layout_width =" match_parent "android: layout_height =" match_parent "android: padding =" 16dp "> < ToggleButton android: layout_width = "match_parent" android: layout_height = "wrap_content" android: textOff = "@ streng /aktivere" android: textOn = "@ streng /deaktivere" android: id = "+ id /toggle" /> < TextView android: layout_width = "match_parent" android: layout_height = "wrap_content" android: text = "@ streng /list_of_ringtones" android: textStyle = "fet" /> < Listview android: layout_width = "match_parent" android: layout_height = "match_parent" android: id = "+ id /list_of_ringtones" /> < /LinearLayout > 
 5. Lag RingtoneHelper Helper Class 
 
 For å unngå å håndtere den RingtoneManager direkte i aktivitet eller BroadcastReceiver, vi skal lage en hjelper klasse som heter RingtoneHelper. 
 Public class RingtoneHelper {} < p> RingtoneHelper klassen vil ha to statiske metoder som gjør bruk av RingtoneManager klassen. 
 
 fetchAvailableRingtones 
 
 fetchAvailableRingtones metoden henter listen over tilgjengelige ringetoner, returnerer en liste over Ringtone gjenstander . 
 public static List < Ringtone > fetchAvailableRingtones (Context kontekst) {List < Ringtone > ringetoner = new Arraylist < > (); RingtoneManager mgr = new RingtoneManager (sammenheng); mgr.setType (RingtoneManager.TYPE_RINGTONE); . int n = mgr.getCursor () getCount (); for (int i = 0; i < n; i ++) {ringtones.add (mgr.getRingtone (i)); } Returnere ringetoner;} 
 I fetchAvailableRingtones metode, starter vi ved å opprette en forekomst av RingtoneManager klassen. Den RingtoneManager objekt kan liste opp alle lydene som finnes på enheten. Dette inkluderer lyder for alarmer og andre varsler. 
 
 Vi bruker setType metode for å sette sitt slag til TYPE_RINGTONE som vi er bare interessert i ringetoner. 
 
 Vi deretter påberope getCount metode for å vite hvordan mange ringetoner er tilgjengelig og ringe getRingtone metoden i en for loop, og legger hver ringetone til ringetoner. 
 
 changeRingtone 
 
 changeRingtone metoden er ansvarlig for å skifte ringetone på enheten, den kjernen funksjon i vår app 
 public static void changeRingtone (Context kontekst) {SharedPreferences preferanser = context.getSharedPreferences ("randomizeren", Context.MODE_PRIVATE.); hvis retur (preferences.getBoolean ("aktiv", false)!); RingtoneManager mgr = new RingtoneManager (sammenheng); Random tilfeldig = new Random (System.currentTimeMillis ()); int n = random.nextInt (mgr.getCursor () getCount ().); RingtoneManager.setActualDefaultRingtoneUri (kontekst, RingtoneManager.TYPE_RINGTONE, mgr.getRingtoneUri (n));} 
 Vi sjekker først i SharedPreferences hvis brukeren har aktivert ringetonen randomizeren. Vi bruker deretter Random klassen å plukke et tilfeldig tall som er mindre enn antall tilgjengelige ringetoner. 
 
 getRingtoneUri metode kalles å hente URI av tilsvarende ringetone og gi det til setActualDefaultRingtoneUri metode for å endre ringetonen . 
 
 6. Lag Broadcast Receiver 
 
 Opprett en ny klasse som heter RingReceiver som arver fra BroadcastReceiver. Den nye klassen vil ha kun én metode som heter OnReceive. I denne metoden, er alt vi gjør kaller hjelperen klassens changeRingtone metoden hvis følgende kriterier er oppfylt: 
 
 virkningen av den mottatte Intent er lik TelephonyManager.ACTION_PHONE_STATE_CHANGED 
 
 verdien av oppslagsnøkkelen EXTRA_STATE er lik TelephonyManager.EXTRA_STATE_RINGING 
 
 Dette er hva RingReceiver klassen skal se ut: 
 public class RingReceiver strekker BroadcastReceiver {Override public void OnReceive (Context kontekst, Intent hensikt .) {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 (sammenheng); }}}} 
 7. Opprett Aktivitet 
 
 Opprett en ny klasse som heter MainActivity som arver fra aktivitet. Vi overstyre onCreate metode og utføre følgende handlinger: 
 
 påberope setContentView å bruke oppsettet definert i activity_main.xml 
 
 kaller hjelperen klassens fetchAvailableRingtones metode for å fylle en liste over ringetoner 
 
 initialisere Listview 
 
 initialisere ToggleButton 
 
 MainActivity klassen skal nå se omtrent slik ut: 
 public class MainActivity strekker Aktivitet {private Listview listOfRingtones; private ToggleButton toggleRandomizer; private List < Ringtone > ringetoner; Override Beskyttet 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); ringetoner = RingtoneHelper.fetchAvailableRingtones (denne); initializeList (); initializeToggle (); }} 
 initializeToggle 
 
 I initializeToggle metoden vi satt tilstanden i veksleknappen basert på en boolsk verdi kalt aktiv i SharedPreferences. Denne verdien er satt til false som standard. 
 
 Vi legger også til en OnCheckedChangeListener å veksle knappen for å oppdatere verdien i SharedPreferences. Den putBoolean og forplikte metoder i Redaktørplakaten blir brukt for å oppnå dette 
 private void initializeToggle () {endelige SharedPreferences preferences = getSharedPreferences ("randomizeren", Context.MODE_PRIVATE.); boolean aktiv = preferences.getBoolean ("aktiv", false); toggleRandomizer.setChecked (aktiv); toggleRandomizer.setOnCheckedChangeListener (ny CompoundButton.OnCheckedChangeListener () {Override public void onCheckedChanged (CompoundButton buttonView, boolsk isChecked) {preferences.edit () putBoolean ("aktiv", isChecked) .commit ();.}});} 
 initializeList 
 
 initializeList metoden skaper en adapter basert på listen over ringetoner. Bruk android.R.layout.simple_list_item_1 som utformingen av elementene i listevisningen. Det er ikke annet enn en TextView. Det skal vise tittelen på ringetonen, ved hjelp av Ringtone klassens getTitle metode. Dette bør gjøres inne i getView metoden i Adapter, etter overstyrer det. 
 
 Når Adapter er klar, tilordne den til Listview ved å bruke Listview er setAdapter metode. 
 Private void initializeList () {ArrayAdapter < Ringtone > adapter = new ArrayAdapter < Ringtone > (dette, android.R.layout.simple_list_item_1, ringetoner) {Override offentlig Vis getView (int posisjon, Utsikt convertView, ViewGroup forelder) {TextView element = (TextView) super.getView (posisjon, convertView , foreldre); item.setText (ringtones.get (stilling) .getTitle (MainActivity.this)); returnere varen; }}; listOfRingtones.setAdapter (adapter);} 
 8. Kompilere og kjøre 
 
 Vår app er nå klar til å bli utplassert på en Android-telefon. Du bør være i stand til å se alle de ringetoner tilgjengelig på telefonen din når du starter programmet. Klikk på bytteknappen for å aktivere randomizeren. 
 
 Ring deg selv fra en annen telefon et par ganger. Første gang du mottar en samtale, vil den opprinnelige ringetone skal spilles. Fra neste samtale og fremover, vil du høre en tilfeldig ringetone hver gang. 
 
 Merk at dette programmet endrer standard ringetone på telefonen. Hvis du har tilordnet en bestemt ringetone til en kontakt eller en gruppe kontakter, vil som ringetone fortsatt brukes. 
 
 Konklusjon 
 
Du vet nå hvordan å gjøre bruk av funksjonaliteten som er tilgjengelig i RingtoneManager klassen . Du har også lært å oppdage innkommende samtaler. Føl deg fri til å bygge videre på dette programmet å random andre varslinger på en lignende måte. Besøk Android Developer nettsted for å lære mer om RingtoneManager klassen.

