Autore Topic: Come fermare la riproduzione della musica SOLO quando si esce da una app  (Letto 3706 volte)

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Ho fatto un'app che ha un pulsante, se premuto parte un service che riproduce un file .mp3
Funziona tutto correttamente
Adesso vorrei fare in modo che quando la mia app viene messa in background la musica si fermi
Quello che ho fatto è stato di fermare il service responsabile della riproduzione della musica nel metodo onPause
Funziona, la musica viene fermata quando l'app viene messa in background
Il problema è che il metodo onPause viene richiamato anche quando passo da un'activity all'altra
come faccio ad implementare un comportamento di questo tipo:
- quando l'app viene messa in background fermo la musica
- quando sto passando da un'activity ad un'altra la musica continua a suonare

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #1 il: 15 Febbraio 2011, 16:35:50 CET »
0
beh....comunque si mette in pausa, quindi.....
dovresti utilizzare un flag, cosicché quando la metti tu in background lui si ferma, altrimenti non lo fa; aggiungi un controllo proprio sull'onPause.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #2 il: 15 Febbraio 2011, 16:45:59 CET »
+1
Bhè se vuoi fermare il servizio solo quando si chiude definitivamente la tua app, fermalo nell' onDestroy dell'Activity.
Se invece vuoi fermarlo quando ad esempio premi il tasto home del device...implementa un onKeyDown, specificando come keyCode KEYCODE_HOME

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #3 il: 15 Febbraio 2011, 16:48:07 CET »
0
la musica deve essere fermata non solo quando premo home ma quando viene messa in background e anche quando lo schermo si spenge per inattività

c'è un metodo che mi dice se la mia app è attiva?

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #4 il: 15 Febbraio 2011, 16:57:09 CET »
+1
Potresti anche gestire tutto dal Service estendendolo come BroadcastReceiver, in modo da fermare la musica quando riceve degli Intent dalla tua app, mentre per quanto riguarda lo schermo potresti usare l'Intent di sistema ACTION_SCREEN_OFF

Ricordati anche di terminare il servizio quando la tua app viene distrutta  ;-)
« Ultima modifica: 15 Febbraio 2011, 16:59:05 CET da teskio »

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #5 il: 15 Febbraio 2011, 17:29:06 CET »
0
Ho capito che devo implementare un BroadcastReceiver per avviare o fermare il mio servizio quando lo schermo si disattiva o si attiva
non ho capito come fare a fermare il mio servizio quando la mia applicazione viene messa in background

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #6 il: 15 Febbraio 2011, 18:07:35 CET »
+1
Allora, usando un BroadcastReceiver, ti basta inviare un Intent (ovviamente tra quelli "registrati" dal BroadcastReceiver) per avviare o terminare il servizio in questione.
In pratica :
onCreate dell'Activity principale -> sendBroadcast( IL TUO CUSTOM INTENT DI AVVIO)
se lo schermo si spegne -> il sistema invierà ACTION_SCREEN_OFF e il tuo BroadcastReceiver fermerà il servizio
se viene premuto il tasto HOME -> sendBroadcast(IL TUO CUSTOM INTENT DI STOP)
(dovrai implementare l'onKeyDown per ogni Activity)

In questo modo se passi da un'Activity all'altra il servizio continuerà ad esistere, e verrà fermato solo quando invierai l'apposito Intent.
Bhè questa potrebbe essere una strada...a te la scelta.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #7 il: 15 Febbraio 2011, 18:17:36 CET »
+1
Allora, usando un BroadcastReceiver, ti basta inviare un Intent (ovviamente tra quelli "registrati" dal BroadcastReceiver) per avviare o terminare il servizio in questione.
In pratica :
onCreate dell'Activity principale -> sendBroadcast( IL TUO CUSTOM INTENT DI AVVIO)
se lo schermo si spegne -> il sistema invierà ACTION_SCREEN_OFF e il tuo BroadcastReceiver fermerà il servizio
se viene premuto il tasto HOME -> sendBroadcast(IL TUO CUSTOM INTENT DI STOP)
(dovrai implementare l'onKeyDown per ogni Activity)

In questo modo se passi da un'Activity all'altra il servizio continuerà ad esistere, e verrà fermato solo quando invierai l'apposito Intent.
Bhè questa potrebbe essere una strada...a te la scelta.

se vuoi un consiglio fatti un'activity del tipo ManagingActivity che fa già l'override di onKeyDown e magari ha gia un metodo che invia il messaggio di stop al service,
poi tutte le tue activity le fai che estendono questo tipo di activity creato,cosi non hai codice in mezzo e ripetuto piu volte
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #8 il: 15 Febbraio 2011, 18:22:55 CET »
0
teskio con questa strada si riesce ad intercettare il tasto home e magari anche il tasto indietro
ma metti caso che arriva una telefonata (quindi non è stato premuto il tasto home)), la mia app finisce in background, in questo caso come faccio a dirgli di fermare il mio servizio?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #9 il: 15 Febbraio 2011, 19:17:20 CET »
0
teskio con questa strada si riesce ad intercettare il tasto home e magari anche il tasto indietro
ma metti caso che arriva una telefonata (quindi non è stato premuto il tasto home)), la mia app finisce in background, in questo caso come faccio a dirgli di fermare il mio servizio?

in quel caso credo sia android a fermare la musica... CREDO però
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #10 il: 16 Febbraio 2011, 00:35:11 CET »
+1
Arriva una chiamata? Intercetti l'intent...arriva un SMS? Intercetti l'intent...c'è poca batteria? Intercetti l'intent...c'è un intent praticamente per tutto :-P
Per quanto riguarda l'ovverride dell'onKeyDown quotone di Nicola!

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #11 il: 17 Febbraio 2011, 01:39:48 CET »
0
Ok ho implementato il mio boradcast
questo è il ocidce cheho messo nel manifest:

Codice (XML): [Seleziona]
                <receiver
                        android:enabled="true"
                        android:name="MusicaBroadcastReceiver">
                        <intent-filter>
                                <action android:name="avviaMusica" />
                                <action android:name="fermaMusica" />
                                <action  android:name="android.intent.action.SCREEN_OFF" />    
                                <action  android:name="android.intent.action.SCREEN_ON" />    
                                <action  android:name="android.intent.action.SEARCH" />    
                   
                        </intent-filter>
                </receiver>

Questo è il codice del mio broadcast:

Codice (Java): [Seleziona]
public class MusicaBroadcastReceiver extends BroadcastReceiver implements
                Constants {

        @Override
        public void onReceive(Context context, Intent intent) {
                //context è un oggetto di tipo receiverRestrictedContext
                Stato stato = (Stato) (context.getApplicationContext());
                String actionName = intent.getAction();
                Log.d(this.toString(), "this actionName: " + actionName);
                if (AVVIA_MUSICA_INTENT.equals(actionName))
                        context.startService(new Intent(context, MusicaService.class));
                else if (FERMA_MUSICA_INTENT.equals(actionName))
                        context.stopService(new Intent(context, MusicaService.class));
                else if ("android.intent.action.SCREEN_ON".equals(actionName)) {
                        if (stato.isMusicaAttiva())
                                context.startService(new Intent(context, MusicaService.class));
                } else if ("android.intent.action.SCREEN_OFF".equals(actionName))
                        context.stopService(new Intent(context, MusicaService.class));
        }
}

Come vedete ho messo un log per stampare il nome dell'azione che arriva
Funziona quando eseguo questo codice da una qualsiasi delle mie activity:

Codice (Java): [Seleziona]
Intent i = new Intent(FERMA_MUSICA_INTENT);
                i.setClassName("it.demo", "it.demo.MusicaBroadcastReceiver");
                activity.sendBroadcast(i);

Invece non funziona, quando spengo il display del cellulare o quando premo il bottone di ricerca, non viene neanche stampato il log che ho messo
In pratica non arrivano gli eventi:
android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON 
android.intent.action.SEARCH

cosa sbaglio?

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #12 il: 17 Febbraio 2011, 15:51:12 CET »
0
Ho cercato e ricercato con google ed ho trovato questo post
Android - how to receive broadcast intents ACTION_SCREEN_ON/OFF? - Stack Overflow
Dice che gli sviluppatori di android per certi segnali non considerano quello che si dichiara nel manifest ma vogliono che venga specificato da codice java, l'intente SCREEN_OFF e SCREEN_ON rientra tra questi tipi di segnali
Allora ho cambiato il mio codice e nella onResume della mia prima activity ho messo questo codice:

Codice (Java): [Seleziona]
        @Override
        protected void onPause() {
                super.onPause();
                Log.e(this.toString(), "onPause");
                Stato stato = (Stato)getApplicationContext();
                MusicaBroadcastReceiver intentReceiver = stato.getIntentReceiver();
                unregisterReceiver(intentReceiver);
        }

        /**
         * Devo:
         *  - ripristinare l'oggetto Stato
         *  - avviare la musica se era attiva
         */

        @Override
        protected void onResume() {
                super.onResume();
                Log.e(this.toString(), "onResume");
                Context context = getApplicationContext();
                Stato stato = (Stato)context;
                loadBroadcastReceiver(stato);

        }

private void loadBroadcastReceiver(Stato stato) {
                MusicaBroadcastReceiver intentReceiver = new MusicaBroadcastReceiver();
                stato.setIntentReceiver(intentReceiver);
                IntentFilter intentFilter = new IntentFilter(
                                "android.intent.action.SCREEN_OFF");
                registerReceiver(intentReceiver, intentFilter);
                IntentFilter  intentFilter2 = new IntentFilter(
                                "android.intent.action.SCREEN_ON");
                registerReceiver(intentReceiver, intentFilter2);
        }


Il risultato non è cambiato cioè se premo il bottone della musica l'evento arriva al mio BroadcastReceiver e si attiva o disattiva la musica
Se accendo e spengo lo schermo del mio cell la musica non si attiva nè disattiva, no narriva proprio nessun evento al mio Broadcast

Ho provato questo codice sia mantenendo nel manifest
Codice (XML): [Seleziona]
                <action  android:name="android.intent.action.SCREEN_OFF" />    
                <action  android:name="android.intent.action.SCREEN_ON" />  

sia togliendo queste dichiarazioni dal manifest, aiuto...
« Ultima modifica: 17 Febbraio 2011, 16:12:49 CET da andream1977 »

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #13 il: 18 Febbraio 2011, 11:19:40 CET »
0
Ho scoperto il problema
chiamavo il metodo per fare la myUnregisterReceiver(intentReceiver); nel metodo onPause che è il punto sbagliato per farlo
adesso ho messo la

loadMyReceiver nella onCreate della mia activity principale
mentre ho messo la myUnregisterReceiver(intentReceiver); nella onDestroy di ogni mia activity

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Come fermare la riproduzione della musica SOLO quando si esce da una app
« Risposta #14 il: 18 Febbraio 2011, 12:35:27 CET »
0
forse sarebbe meglio nella onStop()? perchè la onDestroy se non sbaglio può anche non essere chiamata...

fai una prova
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia