Autore Topic: Musica background solo nella main activity  (Letto 721 volte)

Offline lele1

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Musica background solo nella main activity
« il: 17 Settembre 2017, 23:04:16 CEST »
0
Salve a tutti.
Il mio nome è Emanuele e sono assolutamente neofita nella programmazione in generale, ma nonostante ciò sono riuscito ad improntare un accenno di app..
Ora ho un problema:
Ho bisogno che un sottofondo musicale si avvii in loop all'apertura dell'app ma si fermi al passaggio ad altre activity per poi riattivarsi quando si torna nuovamente alla main e si arresti ovviamente alla chiusura dell'app.
Ho provato sia con mediaplayer che con un service ma non funziona correttamente come vi ho descritto che vorrei.
Qualcuno ha suggerimenti?


Inviato dal mio iPhone utilizzando Tapatalk

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Musica background solo nella main activity
« Risposta #1 il: 18 Settembre 2017, 01:04:06 CEST »
0
Ciao, credo che il mediaplayer sia la classe giusta da usare; non so cosa hai fatto (magari posta il codice o il motivo per cui dici che non funziona come dovrebbe), cmq io userei gli eventi del ciclo di vita di una activity in particolare:

- onresume per far partire la musica
- onpause per farla stoppare

Guarda qui che c'è il ciclo di vita di una activity https://developer.android.com/guide/components/activities/activity-lifecycle.html
Cmq, spiega meglio i problemi che hai che magari riusciamo ad essere più precisi
Ciao
P

Offline lele1

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Musica background solo nella main activity
« Risposta #2 il: 18 Settembre 2017, 13:09:01 CEST »
0
Ciao, credo che il mediaplayer sia la classe giusta da usare; non so cosa hai fatto (magari posta il codice o il motivo per cui dici che non funziona come dovrebbe), cmq io userei gli eventi del ciclo di vita di una activity in particolare:

- onresume per far partire la musica
- onpause per farla stoppare

Guarda qui che c'è il ciclo di vita di una activity https://developer.android.com/guide/components/activities/activity-lifecycle.html
Cmq, spiega meglio i problemi che hai che magari riusciamo ad essere più precisi
Ciao
P
Ciao e grazie per la risposta.
Infatti avevo provato proprio con onResume e onPause ma creando il mediaplayer all'interno di ognuno, se lo creo all'esterno l'app non si apre e se lo creo dentro l'onCreate non riesco a richiamarlo negli altri metodi


Inviato dal mio iPhone utilizzando Tapatalk

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Musica background solo nella main activity
« Risposta #3 il: 18 Settembre 2017, 13:58:19 CEST »
0
Ciao, se posti il codice posso provare a darti supporto. Che errore ti da?
P

Offline lele1

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Musica background solo nella main activity
« Risposta #4 il: 18 Settembre 2017, 19:21:09 CEST »
0
Ciao, se posti il codice posso provare a darti supporto. Che errore ti da?
P
Allora ci provo.
Se scrivo così:

public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.start();

Button......(per passare ad un'altra activity)
player.stop ();
}
}
}

Sono col tel e non potendo fare copia incolla l'ho scritto alla meglio.. spero si capisca.
Comunque con questo codice la musica parte all'avvio dell'app, quando passo ad un'altra activity si ferma ma quando torno alla main col tasto back non riparte.

Se invece faccio così:

public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Button......(per passare ad un'altra activity)

}
}
protected void onResume()
{
super.onResume();
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.start();
}
protected void onPause()
{
super.onPause();
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.stop();
}
}

Così è un disastro..
Ad ogni passaggio di activity è come se si avviasse la riproduzione diverse volte sovrapponendosi.

Se invece faccio così (che è mi sembra la soluzione più sensata):

public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Button......(per passare ad un'altra activity)

}
}
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);

protected void onResume()
{
super.onResume();
player.start();
}
protected void onPause()
{
super.onPause();
player.stop();
}
}

L'app non si avvia e va subito in crash anche se android studio non mi da nessun errore.

Ho cercato di descrivere le soluzioni che ho tentato ma è un casino lo so.. scusate la poca chiarezza



Inviato dal mio iPhone utilizzando Tapatalk

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Musica background solo nella main activity
« Risposta #5 il: 19 Settembre 2017, 00:48:43 CEST »
0
Ciao, allora vediamo se riesco ad aiutarti; per il primo codice che hai scritto

Codice (Java): [Seleziona]
public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.start();

Button......(per passare ad un'altra activity)
player.stop ();
}
}
}

credo che, al netto di altri errori che potrebbero esserci, la musica non riparte quando torni nella activity perchè hai messo tutto nella "On Create"... quando torni indietro dalla seconda activity non passi dalla "On Create", ma passi in teoria dall'evento "On resume" ... guarda activity-lifecycle

Per il secondo codice:

Codice (Java): [Seleziona]
public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Button......(per passare ad un'altra activity)

}
}
protected void onResume()
{
super.onResume();
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.start();
}
protected void onPause()
{
super.onPause();
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.stop();
}
}

praticamente non stoppi mai l'esecuzione. Infatti, nell'OnPause tu crei un'altra istanza di un mediaplayer che perà non è mai stato fatto partire (l'istanza che crei nell'onpause non è la stessa che crei nel onresume)... quindi la prima volta passi dall'onresume che fa partire la musica, quando passi alla seconda activity nell'onpause praticamente non fai nulla in relazione al mediaplayer che sta suonando, così quando torni indietro dalla seconda activity ripassi dall'onresume e fai partire una nuovo mediaplayer che si va a sovraporre al precedente

Il terzo codice, cioè:
Codice (Java): [Seleziona]
public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Button......(per passare ad un'altra activity)

}
}
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);

protected void onResume()
{
super.onResume();
player.start();
}
protected void onPause()
{
super.onPause();
player.stop();
}
}

è più o meno quello che intendevo io. Il problema secondo me è in questa istruzione:

Codice (Java): [Seleziona]
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);Non puoi instanziare il player nella fase dichiarativa perchè il context non esiste ancora. Potresti provare così:

Codice (Java): [Seleziona]
public class MainActivity extends AppCompatActivity {
    //Dichiarazione istanza accessibile da tutta la classe
    private MediaPlayer player=null;

    .......

    @Override
    public void onResume() {
        super.onResume();
        //Creazione istanza
        this.player=MediaPlayer.create(this, R.raw.sound);
        //Avvio musica
        this.player.start();
    }

    @Override
    public void onPause() {
        super.onPause();
        //stop musica sulla stessa istanza dello start()
        player.stop();
        //Reset
        player.reset();
        //Rilascio risorse del player
        player.release();
        //distruzione istanza player
        player=null;
    }

Credo che così possa funzionare, ho provato con una sola activity e il suono parte, lascio a te il compito di verificare se nel passaggio tra una activity ed un'altra tutto lavora come deve...
tienici aggiornati
Ciao
P
« Ultima modifica: 19 Settembre 2017, 00:54:07 CEST da berpao »

Offline lele1

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Musica background solo nella main activity
« Risposta #6 il: 19 Settembre 2017, 19:24:20 CEST »
0
Ciao, allora vediamo se riesco ad aiutarti; per il primo codice che hai scritto

Codice (Java): [Seleziona]
public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.start();

Button......(per passare ad un'altra activity)
player.stop ();
}
}
}

credo che, al netto di altri errori che potrebbero esserci, la musica non riparte quando torni nella activity perchè hai messo tutto nella "On Create"... quando torni indietro dalla seconda activity non passi dalla "On Create", ma passi in teoria dall'evento "On resume" ... guarda activity-lifecycle

Per il secondo codice:

Codice (Java): [Seleziona]
public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Button......(per passare ad un'altra activity)

}
}
protected void onResume()
{
super.onResume();
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.start();
}
protected void onPause()
{
super.onPause();
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);
player.stop();
}
}

praticamente non stoppi mai l'esecuzione. Infatti, nell'OnPause tu crei un'altra istanza di un mediaplayer che perà non è mai stato fatto partire (l'istanza che crei nell'onpause non è la stessa che crei nel onresume)... quindi la prima volta passi dall'onresume che fa partire la musica, quando passi alla seconda activity nell'onpause praticamente non fai nulla in relazione al mediaplayer che sta suonando, così quando torni indietro dalla seconda activity ripassi dall'onresume e fai partire una nuovo mediaplayer che si va a sovraporre al precedente

Il terzo codice, cioè:
Codice (Java): [Seleziona]
public class MainActivity extends Activity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
{
Button......(per passare ad un'altra activity)

}
}
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);

protected void onResume()
{
super.onResume();
player.start();
}
protected void onPause()
{
super.onPause();
player.stop();
}
}

è più o meno quello che intendevo io. Il problema secondo me è in questa istruzione:

Codice (Java): [Seleziona]
Final MediaPlayer player=MediaPlayer.create(context, R.raw.sound);Non puoi instanziare il player nella fase dichiarativa perchè il context non esiste ancora. Potresti provare così:

Codice (Java): [Seleziona]
public class MainActivity extends AppCompatActivity {
    //Dichiarazione istanza accessibile da tutta la classe
    private MediaPlayer player=null;

    .......

    @Override
    public void onResume() {
        super.onResume();
        //Creazione istanza
        this.player=MediaPlayer.create(this, R.raw.sound);
        //Avvio musica
        this.player.start();
    }

    @Override
    public void onPause() {
        super.onPause();
        //stop musica sulla stessa istanza dello start()
        player.stop();
        //Reset
        player.reset();
        //Rilascio risorse del player
        player.release();
        //distruzione istanza player
        player=null;
    }

Credo che così possa funzionare, ho provato con una sola activity e il suono parte, lascio a te il compito di verificare se nel passaggio tra una activity ed un'altra tutto lavora come deve...
tienici aggiornati
Ciao
P
Funziona perfettamente!!
Mille grazie!


Inviato dal mio iPhone utilizzando Tapatalk

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Musica background solo nella main activity
« Risposta #7 il: 20 Settembre 2017, 07:45:12 CEST »
0
Ottimo, se non hai altri problemi ricordati di chiudere il topic...
Ciao e ci sentiamo
P

Offline lele1

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Musica background solo nella main activity
« Risposta #8 il: 20 Settembre 2017, 13:22:55 CEST »
0
Ottimo, se non hai altri problemi ricordati di chiudere il topic...
Ciao e ci sentiamo
P
Perdona l'ignoranza, ma come si chiude il topic?


Inviato dal mio iPhone utilizzando Tapatalk

Offline berpao

  • Utente normale
  • ***
  • Post: 162
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Musica background solo nella main activity
« Risposta #9 il: 20 Settembre 2017, 13:37:30 CEST »
0
Tranquillo,
ci dovrebbe essere un tasto "Topic risolto" o "Topic solved" di fianco al tasto "Rispondi"...
In queto modo nella lista dei topic, viene marcato come risolto e uno sa che il problema è chiuso
Ciao
P

Offline lele1

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Musica background solo nella main activity
« Risposta #10 il: 20 Settembre 2017, 20:04:46 CEST »
0
Tranquillo,
ci dovrebbe essere un tasto "Topic risolto" o "Topic solved" di fianco al tasto "Rispondi"...
In queto modo nella lista dei topic, viene marcato come risolto e uno sa che il problema è chiuso
Ciao
P
Mi spiace ma accanto al tasto "rispondi" c'è solo un omino con un segno di spunta.
Forse è perché uso Tapatalk ma non lo trovo..


Inviato dal mio iPhone utilizzando Tapatalk