Italian Quando lo schermo diventa buio...

Giusy

Active Member
Licensed User
Salve, ho scritto un programma dove delle canzoni suonano in sequenza, ma quando lo schermo diventa nero, il programma esegue l'ultima canzone e poi il tutto si ferma e la sequenza si interrompe. Potete indicarmi quali istruzioni devo inserire affinché questo non accada?
Grazie :)
 

Giusy

Active Member
Licensed User
ahahahah @LucaMs proprio per questo oggi sono sulla community italiana (siamo più allegri e meno seriosi)

In effetti ho scritto questo sul mio programma:

dim onscreen as phonewakestate

su activity resume
onscreen.keepalive(true)

su activity pause
onscreen.releasekeepalive

Se l'utilizzatore tenesse le mani a posto funzionerebbe tutto perfettamente, ma se premo il tasto a destra in alto (lo schermo diventa buio) non funziona
Se premo il tasto Home idem

Ho trovato delle istruzioni dove, devo dirti la verità, non ho capito nulla (ah... adorato vb6)
Che fare?
 

LucaMs

Expert
Licensed User
Longtime User
Se l'utilizzatore tenesse le mani a posto
Sai come sono gli uomini, non sanno tenere le mani a posto; nel tuo caso, visto che l'app l'ha sviluppata una donna... è normale :D

Tornando seri (si fa per dire) quelle istruzioni prevengono la messa in standby automatica, non azioni dell'utente, che non possono essere impedite (come la pressione di Home).

In questo stato, standby dello smartphone, penso sia normale che non si possa continuare ad ascoltare i tuoi brani.

Non mi preoccuperei, quindi.
 

Giusy

Active Member
Licensed User
Loro, tutti quelli che non sono italiani ;) fanno riferimento a:
call Service.StartForeground.
e quindi riescono a gestire tutte le situazioni in cui il programma non si trova in primo piano, purtroppo per me è ostrogoto, tu n e sai qualcosa?
 

LucaMs

Expert
Licensed User
Longtime User
Dunque... non prendere quanto sto per scrivere per oro colato, visto che non ho fatto pratica su queste cose.

Suppongo che fai suonare le tue canzoni usando il MediaPlayer; questo dovresti metterlo in un servizio.

Nel servizio, nella routine Service_Create dovresti "impostare" esso per far sì che resti sempre in Foreground, chiamando:

Service.StartForeground(1, Notifica)

in cui Notifica è appunto un oggetto Notification che crei immediatamente prima di lanciare il comando sopra.

[anche per le notifiche alcune cose sono cambiate, purtroppo:
Notification object rewritten to work with targetSdkVersion 26. In most cases you don't need to change anything. Notification.SetInfo or Notification.SetInfo2 should be the last calls before you show the notification.
]

Per evitare lo "oscuramento" del display, usa ancora il tuo codice del post #3.

Altre novità, che riguardano Android 8+, sono queste:
https://www.b4x.com/android/forum/threads/automatic-foreground-mode.90546/

ma non credo che riguardino il tuo caso.


Se crei un progetto di prova, giusto con il minimo necessario, e non dovesse funzionare come ti serve, puoi allegarlo qui e vedremo di darti una mano.
 

Giusy

Active Member
Licensed User
Ti ringrazio @LucaMs, in effetti uso il mediaplayer, ed alla fine di ogni canzone lo chiudo, carico la canzone e lo faccio ripartire. E' da circa un mese che utilizzo b4a e quindi le mie conoscenze sono limitate. Per terminare il mio progetto mi manca solo questo controllo.
"metterlo in un servizio", "notifica" sono per me solo dei concetti che non purtroppo non conosco. Se tu riuscissi a recuperare due linee di programma, che io possa studiare e soprattutto capire, te ne sarei davvero grata :)
 

Giusy

Active Member
Licensed User
Grazie @LucaMs proverò a inserire il tutto nel mio programma, poi funzioni oppure no,(spero di si) sei stato veramente cortese.
Grazie ancora :)
 

Giusy

Active Member
Licensed User
Ciao @LucaMs ormai sono alla disperazione più completa. Il tuo programma, per una canzone è ok, ma quando sono due, il tutto si interrompe dopo la prima. Sono io che sbaglio qualcosa? Non so. Nelle zone inglesi ho postato il tuo programma in formato ridotto, ponendo la stessa domanda direttamente a Erel, e non ho ottenuto risposta. Ormai confido solo più in te :)
 

LucaMs

Expert
Licensed User
Longtime User
Nelle zone inglesi ho postato il tuo programma in formato ridotto, ponendo la stessa domanda direttamente a Erel, e non ho ottenuto risposta.
Ho visto ed hai ottenuto una risposta assolutamente spiegata male:

you not add the Event Sub for this
B4X:
mMediaPlayer.Initialize2("MediaPlayer")
but i guess its because of example project.

Io non l'ho capita :D

Non avendo il tuo progetto sotto mano (magari potresti pubblicare qui la parte rilevante) non so dirti molto.
Posso dirti che, per come l'ho fatto io, dato il MediaPlayer è dichiarato ed inizializzato nel servizio srvPlayer, al temine del brano scatterà l'evento:

Sub MediaPlayer_Complete

(cui, non so che in che modo, accennava Markus :eek:).

Ora, è da qui che dovresti far iniziare il brano successivo, ovviamente. Se il lancio dell'esecuzione dei brani avviene invece da un'Activity, dovresti fare in modo che all'interno della suddetta routine venga chiamata una routine dell'Activity, ad esempio:

B4X:
' modulo di servizio srvPlayer

Sub MediaPlayer_Complete
    CallSubDelayed(Main, "BranoConcluso")
End Sub

e "gestire" il resto nella routine BranoConcluso dell'Activity Main.

Si può fare anche meglio, usando Wait For, che potrei spiegarti (o potresti guardare il video tutorial di Erel) ma dipende dal tuo progetto se valga la pena o meno.
 

Giusy

Active Member
Licensed User
Anch'io non l'ho capita... vabbé. Il tuo programma, se non ho capito male, non permette lo spegnimento automatico del device che invece dovrebbe esserci, ma non è questo il punto...Io sul tuo programma ho provato a lanciare un nuovo motivo quando il tuo primo terminava (nella sub mMediaplayer_complete) ma suonava solo il tuo e non il mio. Sarò troppo stanca? Se riuscissi a far funzionare il tuo programma con due brani sarebbe il massimo, inserire poi le routine nel mio programma diventerebbe più proficuo. Hai qualche suggerimento?
 

Giusy

Active Member
Licensed User
@LucaMs Ho provato il programma e funziona (non ne dubitavo) adesso me lo guardo, me lo studio e ti terrò aggiornato (se non mi ricoverano prima ahahahahah)
Grazie ancora, sei il mio salvatore :) :)
 

Giusy

Active Member
Licensed User
Allora @LucaMs bellissimo programma, spiegami solo alcuni dettagli.
Utilizzi l'istruzione wait affinché non esca dal ciclo se non dopo il completamento del brano. E' possibile in quel frangente permettere all'utente di interrompere l'esecuzione oppure no?
Qual è in effetti l'istruzione o il gruppo di istruzioni che impedisce che il programma si interrompa a schermo buio?
Grazie, mi hai fatto fare un bel balzo in avanti, te ne sono grata. :)
 

LucaMs

Expert
Licensed User
Longtime User
Utilizzi l'istruzione wait affinché non esca dal ciclo se non dopo il completamento del brano.
Non esattamente; anzi, durante l'esecuzione del brano e durante il ciclo stesso il "flusso" di esecuzione dell'app continua (Wai For e Sleep funzionano proprio in questo modo, non interrompono l'esecuzione dell'app).
Wait For, nel progetto, attende prima di eseguire l'istruzione successiva ma restituisce il controllo all'app.

E' possibile in quel frangente permettere all'utente di interrompere l'esecuzione oppure no?
Sì; chiaramente il progetto dev'essere fatto in maniera diversa.
Puoi fare in in due modi diversi (in entrambi i casi avrai un tasto btnStop e relativa routine evento nella Main):

o scrivi una routine nel srvPlayer:
B4X:
Sub StopPlaying
   mMediaPlayer.Stop
End Sub

e la chiami da:
B4X:
Sub btnStop_Click
   CallSub(srvPlayer, "StopPlaying")
End Sub

oppure cambi la dichiarazione di mMediaPlayer da Private a Public e nella routine:
B4X:
Sub btnStop_Click
   srvPlayer.mMediaPlayer.Stop
End Sub



Qual è in effetti l'istruzione o il gruppo di istruzioni che impedisce che il programma si interrompa a schermo buio?
E' il fatto che il MediaPlayer si trovi in un modulo di servizio.
 

Giusy

Active Member
Licensed User
Ti ringrazio ancora tanto, per i tuoi suggerimenti e per la tua disponibilità.
Adesso so che potrò andare avanti e concludere il mio progetto.
Grazie :)
 
Top