[Android] Aplikacja w tle, włączająca muzykę po podłączeniu słuchawek.

                 Ilekroć wsiadam do samochodu, zawsze pierwszym co robię (oprócz modlenia się żeby odpalił) jest podłączenie telefonu i włączenie muzyki. Zawsze była najważniejszą częścią mojego życia. Niestety zajmuje to sporo czasu, bo telefon jaki posiadam doprowadziłem do stanu istnej cegły. Dlatego postanowiłem napisać jak najlżejszą aplikacje, działającą w tle, która odrobinę zautomatyzuje mi ten proces.
             



  1.  Pierwszym co trzeba zrobić to oczywiście podłączyć telefon i włączyć tryb debuggowania, następnie odpalić nowy projekt w AndroidStudio.
  2. Startujemy na czystym projekcie. Zaczniemy od stworzenia nowej klasy .java "KapitanPiratow.java". W tym pliku zakodujemy cały nasz serwis, odpowiedzialny za działanie aplikacji w tle. 
// com.examle.hexslav.tidalon/PPM/New/Java Class



3. Rozszerzamy klasę o funkcje Serwis (extends Service) oraz definiujemy metodę IBinder, która pozwoli nam powiązać naszą aktywność z serwisem. Wszystkie biblioteki zostaną dodane automatycznie przez Android Studio. 



4. Definiujemy metodę OnStartCommand, która będzie wykonywana po naciśnięciu przycisku "Start". Na razie będzie tam tylko Toast (komunikat z wiadomością), informujący nas że serwis działa.



5. Teraz metoda która zakończy serwis po naciśnięciu przycisku "Stop". OnDestroy. Tym razem zostanie w niej tylko Toast z informacją, samo jej wywołanie w MainActivity spowoduje zakończenie serwisu. 




Póki co tyle w pliku z serwisem, teraz MainActivity i przyciski. 


6. Tworzymy dwa przyciski, Start i Stop w activity_main,xml.




7. W tekstowym odwzorowaniu activity_main,xml dodajemy obu przyciskom atrybuty android:onClick="Nazwa". 



8. Jest to chyba najprostsza metoda wywołania akcji po kliknięciu przyciskiem jaką znalazłem. Teraz wystarczy tylko napisać wywołania metody OnClick w MainAcitivity.java.



9. To co będzie w tych właśnie funkcjach, będzie się wykonywało po kliknięciu przycisku, więc zakodujemy w nich rozpoczęcie serwisu oraz jego zakończenie. 



10. Zanim przetestujemy naszą apkę musimy jeszcze dodać wpis w AndroidManifest.xml pozwalający serwisowi pracować. 



11. Teraz po skompilowaniu, otworzeniu apki i kliknięciu przycisku, ukaże nam się chwalebny Toast.




Mamy działający serwis, oraz przyciski, teraz czas na wywołanie reakcji na podłączenie słuchawek do telefonu.



12. Budujemy MusicIntentReciver, który będzie spełniał tą funkcje. W jego wnętrzu, póki co jest tylko zadeklarowana paczka z aplikacją którą będziemy odpalać, jest to nazwa folderu w której aplikacja jest zainstalowana na telefonie, w moim przypadku (tidal) "com.aspiro.tidal"
Analogicznie jeśli chcemy otwierać np Spotify, w miejsce ścieżki wpisujemy   "com.spotify.music"




13. W metodzie onReceive budujemy teraz pętle sprawdzającą jaki jest stan słuchawek. 




14. W miejscu przypadku case 1; gdzie słuchawki są określone jako podłączone, kodujemy odwołanie do wcześniej zadeklarowanej paczki z aplikacją, wywołując jej odpalenie. 





Teraz aplikacja potrafi rozpoznać kiedy słuchawki zostały podłączone, ale żeby działało to prawidłowo w tle, musimy zbudować jeszcze Thread, w którym będzie działał serwis. To taki osobny proces pozwalający wywoływać działanie bez interferencji z systemem. 


15. Oto Thread, nadal w pliku z naszym serwisem. Musi mieć zadeklarowaną funkcje run(), oraz MyThreadClass() w której nadajemy Id naszemu serwisowi.



16. W funkcji run(), musimy zadeklarować myReciver (do którego odniesieniem się zaraz zajmiemy), oraz IntentFilter z naszym narzędziem do wykrywania stanu słuchawek Intent.ACTION_HEADSET_PLUG.



17. Deklarujemy myReciver, oraz TAG, używany później w pętli. 





Nasz kod jest już w zasadzie gotowy, wystarczy tylko wywołać Thread w funkcji OnStartCommand serwisu i będzie działać.





Hexslav

Komentarze

Popularne posty z tego bloga

Czy naprawa poloneza szarą taśmą to dobry pomysł? Problem z autem w Boże Narodzenie 200km od domu.

Przejmowanie kontroli nad Androidem. ParrotOS/armitage.

Zamek centralny w polonezie za cenę przesyłki.