Italian Bloccare il volume del telefono ad un livello stabilito e sbloccabile dapassword

fifiddu70

Well-Known Member
Licensed User
Longtime User
Come da titolo vorrei creare una app che lavori in background e riesca a non far alzare il volume audio quando usa youtube o giochi nel telefono, questo perchè mia figlia di 3 anni usa il volume al massimo per vedersi i video di me contro te, come del resto anche l'altra mia figlia di 7 anni, sarebbe bello poter avere il controllo del volume a piacere, avete qualche idea ?
 

Star-Dust

Expert
Licensed User
Longtime User
B4X:
Dim p As Phone
Log(p.GetVolume(p.VOLUME_MUSIC))
'p.SetMute(p.VOLUME_MUSIC,False)
p.SetVolume(p.VOLUME_MUSIC, 5, False)

Crea un servizio che controlla il volume oppure un app StandOut che controlla il volume.
Vedi qui ci sono anche metodi per intercettare la pressione del tasto fisici
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Qui c'è un sorgente di Erel che fa al caso tuo

 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
questo perchè mia figlia di 3 anni usa il volume al massimo per vedersi i video di me contro te, come del resto anche l'altra mia figlia di 7 anni
@fifiddu70 ti ringrazio perchè immaginare questa scena mi ha strappato una risata. 🤣
 

Star-Dust

Expert
Licensed User
Longtime User
Ma l'idea non è male, chissà quando i genitori che vorrebbero staccare il volume a due figli che giocano o guardano video sul proprio dispositivo.

Bisognerebbe pubblicarla su Google play
 

Sagenut

Expert
Licensed User
Longtime User
Soprattutto se si riesce a comandare da remoto.
 

Star-Dust

Expert
Licensed User
Longtime User

udg

Expert
Licensed User
Longtime User
Avevo fatto qualcosa del genere nella notte dei tempi. Si chiamava DND (Do Not Disturb).
In pratica azzerava il volume della suoneria finchè non riceveva un SMS con un codice (modificabile). A quel punto permetteva a quello stesso recapito di far squillare (nel senso di udibile) di nuovo la suoneria.
Era una specie di "non rompete per assistenza e consigli se non avete pagato un abbonamento (che vi permette di conoscere il codice di cui sopra)"

Per lo scopo di cui sopra un FCM che invii comandi all'app di controllo del volume o un UDP nella wifi di casa e il controllo remoto si fa.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Allora...ho risolto grazie ai vostri consigli, tra un pezzetto di codice preso di qua e la e delle modifiche e delle aggiunte di codice personale sono riuscito( MINCHIAAAAAA SPETTACOLARE ) scusate il francesismo, ma sono soddisfatto del fatto che mia figlia adesso vede i suoi video di me contro te su youtube senza rompere le scatole al volume alto ed evito tra l'altro di dargli una sculacciata che serve solo in quel momento per poi ritornare a rompere, ho pensato adesso di lavorarci su seriamente perchè avevo pensato anche io di farla già da qualche anno ma non mi ci sono messo mai finchè non e nata la mia marsha di marsha ed orso, ovviamente non è il suo nome ma somiglia a lei per la sua inesauribile energia. SONO CONTENTO :)
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Allora...rieccoci....alla fine il progetto prende forma, adesso volevo fare in modo che dalla main principale si possa impostare un volume tramite spinner ed una edittext, in modo che quanco lancio il servizio e chiudo la main questi prenda il valore della edittext e quindi imposta il volume a quella determinata impostazione, vi posto il codice che però è in fase di sviluppo, ma non riesco a capire perchè non prende i valori della edittext nel servizio:

main:
#Region  Project Attributes
    #ApplicationLabel: Baby Control
    #VersionCode: 1
    #VersionName: 1.0
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #BridgeLogger: True
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim p As Phone
    Dim livellovolume As String
    Dim mp1 As MediaPlayer
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    Private spvolume As Spinner
    Private txtvolume As EditText
    Private btnsalva As Button
    Private btnelimina As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    mp1.Initialize
    txtvolume.Color=Colors.White
    For i = 0 To 50
        spvolume.Add(i)
        
    Next
    'spvolume.SelectedIndex = 5
    'txtvolume.Text = spvolume.SelectedItem
    livellovolume = 5
    
End Sub


Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
  
    If KeyCode = KeyCodes.KEYCODE_VOLUME_UP Then
        Log("Up")
        p.SetVolume(p.VOLUME_MUSIC, txtvolume.Text, False)
        Return True
    End If
    If KeyCode = KeyCodes.KEYCODE_VOLUME_DOWN Then
        Log("Down")
        p.SetVolume(p.VOLUME_MUSIC, txtvolume.Text, False)
        Return True
    End If
End Sub

Sub Activity_Resume
    Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Result Then
        StartService(Volume)
        Log("Vado su Volume da activity resume")
    Else
        ToastMessageShow("No permission...", True)
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    livellovolume = spvolume.SelectedItem
    
End Sub

Private Sub spvolume_ItemClick (Position As Int, Value As Object)
    txtvolume.Text= Value
    livellovolume = txtvolume.Text
    
End Sub





Private Sub btnsalva_Click
    StartService(Volume)
    Activity.Finish
End Sub

mentre il servizio è questo:

Servizio.:
#Region  Service Attributes
    #StartAtBoot: True
  ' Versione 1C ok
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim timer1 As Timer
    Private nid As Int = 1
    Private GPS As GPS
    Private Tracking As Boolean
    Private LastUpdateTime As Long
    Private lock As PhoneWakeState
    Dim hc As     OkHttpClient
    Dim Geocoder1 As Geocoder
    'Dim anna As String
    'Dim filippo As String
    Dim risultatolivello As String
    Dim p As Phone
End Sub

Sub Service_Create
    risultatolivello = Main.livellovolume
    Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_ALWAYS 'we are handling it ourselves
    GPS.Initialize("gps")
    lock.PartialLock
    hc.Initialize("hc")
    timer1.Initialize("timer1",2000)
    Geocoder1.Initialize("it")
    
    
End Sub
Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
   Log("sono su keypress")
    If KeyCode = KeyCodes.KEYCODE_VOLUME_UP Then
        Log("Up")
        
                
            p.SetVolume(p.VOLUME_MUSIC, risultatolivello, False)
            Return True
        
        End If
        
    If KeyCode = KeyCodes.KEYCODE_VOLUME_DOWN Then
        Log("Down")
        
        p.SetVolume(p.VOLUME_MUSIC, risultatolivello, False)
        Return True

    End If
End Sub
Sub Service_Start (StartingIntent As Intent)
    Log(p.GetVolume(p.VOLUME_MUSIC))
    'p.SetMute(p.VOLUME_MUSIC,False)
    p.SetVolume(p.VOLUME_MUSIC, risultatolivello, False)
    timer1.Enabled=True
    Service.StartForeground(nid, CreateNotification("..."))
    
    Track   
    
    StartServiceAtExact(Me, DateTime.Now + 25 * DateTime.TicksPerMinute, True)
End Sub

Sub timer1_Tick
    
    Log(risultatolivello)
    p.SetVolume(p.VOLUME_MUSIC, risultatolivello, False)
    

    Track
    StartServiceAtExact(Me, DateTime.Now + 25 * DateTime.TicksPerMinute, True)
    
End Sub
Public Sub Track
    If Tracking Then Return
    If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then
        Log("No permission")
        Return
    End If
    GPS.Start(0, 0)
    Tracking = True
End Sub

Sub GPS_LocationChanged (Location1 As Location)
    'anna =  Location1.Latitude
    'filippo =  Location1.Longitude
    If DateTime.Now > LastUpdateTime + 3 * DateTime.TicksPerSecond Then
        Dim n As Notification = CreateNotification($"$2.5{Location1.Latitude} / $2.5{Location1.Longitude}"$)
        n.Notify(nid)
        LastUpdateTime = DateTime.Now
        
    End If
    
    
End Sub

Sub CreateNotification (Body As String) As Notification
    Dim notification As Notification
    notification.Initialize2(notification.IMPORTANCE_LOW)
    notification.Icon = "icon"
    notification.Sound=False
    notification.Vibrate=False
    notification.SetInfo("OK", Body, Main)
    
    Return notification
End Sub

Sub Service_Destroy
    If Tracking Then
        GPS.Stop
    End If
    Tracking = False
    lock.ReleasePartialLock
End Sub

il gps mi serve per non far uccidere l'app in background, conseguenza ( eccessivo consumo della batteria )
ovviamente sembra banale ma non ho capito come fargli assumere il valore della edittext della main dal modulo di servizio chiamato ( volume )
 

Star-Dust

Expert
Licensed User
Longtime User
Non assomiglia per niente al sorgente di Erel. Non capisco cosa serva il GPS e soprattutto non serve a niente il Timer di cui tu sembri innamorato.
Nel servizio non esistono eventi Activity, il sorgente è completamente sbagliato.
E' sbagliato anche che imposta sempre lo stesso valore di volume, se funzionasse questo codice (meno male che non funziona) non permetterebbe nemmeno di abbassare il volume

Parti dal sorgente di erel e aggiungi solo un pannello nell'attività dove inserisci il volume massimo. Questo valore va applicato a una variabile pubblica del servizio che controlla se supera quel valore. Solo nel caso di un valore piu alto dovrebbe intervenire il codice a settare il volume
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Non assomiglia per niente al sorgente di Erel. Non capisco cosa serva il GPS e soprattutto non serve a niente il Timer di cui tu sembri innamorato.
Nel servizio non esistono eventi Activity, il sorgente è completamente sbagliato.
E' sbagliato anche che imposta sempre lo stesso valore di volume, se funzionasse questo codice (meno male che non funziona) non permetterebbe nemmeno di abbassare il volume

Parti dal sorgente di erel e aggiungi solo un pannello nell'attività dove inserisci il volume massimo. Questo valore va applicato a una variabile pubblica del servizio che controlla se supera quel valore. Solo nel caso di un valore piu alto dovrebbe intervenire il codice a settare il volume
Infatti non ho detto che questo è il codice di Erel, ho detto di aver preso degli spunti che avevo io più qualche spunto del forum, devo dire che funziona benissimo perchè se provo ad abbassare il volume o ad alzarlo il timer riporta al volume impostato, ed avevo detto in precendenza che si tratta di un progetto in fase di sviluppo, il codice di erel fa la stessa funzione cioè se provi ad abbassare o ad alzare il volume lui lo riporta ad un volume prestabilito, il mio codice è da rifinire e togliere molte cose infatto lo sto semplicizzando, la cosa che non ho capito come passare un valore della edittext al modulo service ( volume ).
L'amore per i timer sarà per mancanza di conoscenza professionale nell'ambito della programmazione, ammetto che non sono un professionista ne conosco tutta la programmazione completa, semplicemente mi piace fare qualcosa.
 

Star-Dust

Expert
Licensed User
Longtime User
Non lo hai semplificato, lo hai ingarbugliato.
Nel sorgente di Erel non c'è timer, eppure funziona. Il servizio si attiva alla variazione del volume e quindi non serve un timer che controlla continuamente il volume.

Per fare quello che vuoi ti bastavano poche modifiche al sorgente di Erel.

Ci sono molti parti di codice inutili e inutilizzati, fra cui il gps e gli eventi activity nel service che non saranno mai chiamate.
Immagino che hai preso un tuo vecchio codice per la localizzazione e hai cercato di adattarlo. Tanto vale modificare quelli di Erel partendo da una base corretta, piuttosto che da un sorgente che non ha nulla a che fare con l'obiettivo che devi raggiungere

Ecco perché ripeto il mio suggerimento di partire dal codice di Erel che è molto ben fatto. Proprio perche dici che non sei un professionista non sarebbe sbagliato accettare qualche consiglio.

Poi fai tu come credi meglio.
 
Last edited:

fifiddu70

Well-Known Member
Licensed User
Longtime User
Non lo hai semplificato, lo hai ingarbugliato.
Nel sorgente di Erel non c'è timer, eppure funziona. Il servizio si attiva alla variazione del volume e quindi non serve un timer che controlla continuamente il volume.

Per fare quello che vuoi ti bastavano poche modifiche al sorgente di Erel.

Ci sono molti parti di codice inutili e inutilizzati, fra cui il gps e gli eventi activity nel service che non saranno mai chiamate.
Immagino che hai preso un tuo vecchio codice per la localizzazione e hai cercato di adattarlo. Tanto vale modificare quelli di Erel partendo da una base corretta, piuttosto che da un sorgente che non ha nulla a che fare con l'obiettivo che devi raggiungere

Ecco perché ripeto il mio suggerimento di partire dal codice di Erel che è molto ben fatto. Proprio perche dici che non sei un professionista non sarebbe sbagliato accettare qualche consiglio.

Poi fai tu come credi meglio.
Si, era un vecchio codice che avevo di un progetto a cui avevo preso qualche spunta, quello di erel è impeccabile, unica cosa vorrei creare con quello di erel la possibilità dalla main principale attraverso una edittex o uno spinner di poter decidere il settaggio personale del volume ed una volta andato in background l'impostazione rimanga quella.
 

Star-Dust

Expert
Licensed User
Longtime User
Nel servizio dichiara una variabile globale. ad esempio:

B4X:
#Region  Service Attributes
    #StartAtBoot: False
   
#End Region

Sub Process_Globals
    Public risultatolivello As Int
End Sub
Sub Service_Create
    Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER
    ' ..... tuo codice
End Sub

mentre dall'App puoi modificare il volume cosi
B4X:
NomeService.risultatolivello =Valore ' NomeService è il nome che hai dato al modulo Service
 
Top