Italian PhoneCalls

nonno

Active Member
Licensed User
Longtime User
Ciao ragazzi, avrei bisogno di qualche consiglio.
uso la libreria Phone per far partire la telefonata come riportato sotto
Dim p As PhoneCalls
StartActivity(p.Call(Value)) ' parte la telefonata
ultimaTelefonata = Value


tutto funziona, avrei bisogno di sapere quando parte la chiamata se
a) il numero e inesistente
b) il numero è occupato
c) il telefono sta squillando
ho dato un occhiata alla libreria Phone
https://www.b4x.com/android/help/phone.html#contact_phone_custom
essendo tutto in inglese o provato a tradurre col traduttore e non ci capisco una mazza.
se qualcuno mi da dei consigli
Grazie Mille
 

LucaMs

Expert
Licensed User
Longtime User
essendo tutto in inglese o provato a tradurre col traduttore e non ci capisco una mazza.
Hai ragione, dovremmo protestare; B4X.COM dovrebbe essere principalmente in italiano; eventualmente piccoli forum in inglese :p

Non ci ho mai smanettato (se non raramente, per altri, molto tempo fa) ma suppongo che si debba usare l'oggetto PhoneEvents:
B4X:
Dim PhoneId As PhoneId
Dim PE As PhoneEvents
PE.InitializeWithPhoneState("PE", PhoneId)

e l'evento:
PhoneStateChanged (State As String, IncomingNumber As String, Intent As Intent)

però temo che il parametro State possa informarti solo se il telefono stia squillando; i valori che dovrebbe restituire, infatti, sono:
State - One of the three values: IDLE, OFFHOOK, RINGING. OFFHOOK means that there is a call or that the phone is dialing.

IDLE sta per "inattivo"
OFFHOOK che c'è una telefonata in corso o che il telefono sta chiamando (componendo il numero, suppongo).
RINGING è quello che dovresti appunto verificare per sapere se stia squillando.

Non so (ma non credo) se qualche informazione supplementare puoi ottenerla dall'Intent.

Puoi trovare molti esempi:
https://www.b4x.com/android/forum/pages/results/?query=PHONEEVENTS

Questo è il primo al quale ho dato un'occhiata che utilizza un modulo di servizio (ha il difetto che tenta di visualizzare una dialog, cosa che non è possibile da un modulo di servizio):
https://www.b4x.com/android/forum/threads/please-help-phonestatechanged.9357/
 
Last edited:

nonno

Active Member
Licensed User
Longtime User
non funziona:( ho provato in vari modi nulla da fare.
sono io che sbaglio qualcosa, sia col telefono che squilla, occupato, che l'utente risponde non cè nessuna differenza .
ho provato anche ad inizializzare PE all'interno della Activity_Create nessuna differenza


Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("main")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
Dim p As PhoneCalls
StartActivity(p.Call("030700****"))
End Sub
Sub Service_Create
End Sub
Sub Service_Start
End Sub
Sub Service_Destroy
End Sub
Sub PE_PhoneStateChanged (State As String, IncomingNumber As String, Intent As Intent)
Dim PhoneId As PhoneId
Dim PE As PhoneEvents
PE.InitializeWithPhoneState("PE", PhoneId)

Select State

Case "RINGING"
ToastMessageShow("RINGING",True)
Case "IDLE"
ToastMessageShow("IDLE",False)
Case "OFFHOOK"
ToastMessageShow("OFFHOOK",False)
End Select
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Colpa mia. Credo proprio che quel RINGING si riferisca allo smartphone che sta eseguendo l'app, ovvero l'evento scatta quando il tuo smartphone riceve una telefonata.

Non penso si possa ottenere ciò che vuoi tu.

Comunque il codice che hai postato non funzionerebbe nemmeno in questo caso, perché la dichiarazione dell'oggetto di tipo PhoneEvents va fatta nella Globals e l'inizializzazione nella Create del modulo di servizio.
 

nonno

Active Member
Licensed User
Longtime User
ho provato anche quello....
il problema è che devo controllare il tempo delle telefonate , se il cliente non risponde do 20 secondi , o il numero è occupato,
dovrebbe fermarsi il timer, se inesistente non dovrebbe nemmeno partire...

Grazie mille Luca
per la risposta.

P.S.
Ma Erel a noi Italiani non risponde ?
 

MarcoRome

Expert
Licensed User
Longtime User
Ciao puoi utilizzare il seguente codice:

Nel servizio Starter inserisci:
B4X:
Sub Service_Start (StartingIntent As Intent)
  
'    Log(StartingIntent)
'    Log(StartingIntent.ExtrasToString)
  
    If StartingIntent.Action = "android.intent.action.PHONE_STATE" Then
      
        Select StartingIntent.GetExtra("state")
            str = StartingIntent.ExtrasToString
            Log("FINISCE LA TELEFONATA: " & str)
            'onhook - call ended or phone idle
            Case "ILDE"
                Log("ILDE")
                'outgoing call processing
            Case "OFFHOOK"
                Log("OFF")
                'incoming call processing
            Case "RINGING"
                Log("CallerID="&StartingIntent.GetExtra("incoming_number"))
     
        End Select
    End If

    If StartingIntent.Action = "android.intent.action.NEW_OUTGOING_CALL" Then
            str = StartingIntent.ExtrasToString
            Log("PARTE LA TELEFONATA: " & str)
        If StartingIntent.HasExtra("android.intent.extra.PHONE_NUMBER") Then
            Dim myphone As String
            myphone = StartingIntent.GetExtra("android.intent.extra.PHONE_NUMBER")
            Log(myphone)
        End If
    End If

End Sub

Nel manifest inserisci:

B4X:
AddPermission(android.permission.READ_PHONE_STATE)
AddReceiverText(Starter,
<intent-filter>
    <action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>)


AddPermission(android.permission.PROCESS_OUTGOING_CALLS)
AddReceiverText(Starter, <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>)

Quando effettuerai una chiamata vedrai che il log "PARTE LA TELEFONATA" e lo stato IDLE.... Se il numero è inesistente o è occupato in italia parte la segreteria tim etc che ti avverte che il numero è errato o sbagliato quindi dopo circa 20 secondi ...troverai il LOG FINISCE LA TELEFONATA.
In ogni caso puoi "giocare" con i parametri che ti ho riportato nel codice, non ci sono chiamate "specifiche" che io sappia
 

nonno

Active Member
Licensed User
Longtime User
OK domani provo
Scusa ma il codice che devo insarire nei manifest cosa intendi ? Non conosco molto B4A
Grazie mille
Marco
 
Last edited:

MarcoRome

Expert
Licensed User
Longtime User
Colpa mia. Credo proprio che quel RINGING si riferisca allo smartphone che sta eseguendo l'app, ovvero l'evento scatta quando il tuo smartphone riceve una telefonata.

Non penso si possa ottenere ciò che vuoi tu.

Comunque il codice che hai postato non funzionerebbe nemmeno in questo caso, perché la dichiarazione dell'oggetto di tipo PhoneEvents va fatta nella Globals e l'inizializzazione nella Create del modulo di servizio.
Bravo Lucas è proprio cosi scatta quando RICEVE la telefonata
 

nonno

Active Member
Licensed User
Longtime User
Scusate una damanda sicuramente stupida !? Non riesco a fare quello che serve per il fatto che non esiste una libreria adatta al mio scopo ?
Come posso fare a scrivere direttamente a EREL ?
Grazie mille
 

LucaMs

Expert
Licensed User
Longtime User
Non riesco a fare quello che serve per il fatto che non esiste una libreria adatta al mio scopo ?
Credo che non si possano proprio ottenere quelle informazioni e che dipenda da ciò che il sistema operativo metta a disposizione. Comunque, mi metto a cercare :)


Come posso fare a scrivere direttamente a EREL ?
Potresti farlo, clickando sul suo nick e poi su "Start a conversation" nella dialog che compare. Però non è il caso, perché se fai la domanda aprendo un nuovo thread ti risponderà lo stesso (se trova la soluzione) e comunque potranno risponderti anche altri membri.
 

LucaMs

Expert
Licensed User
Longtime User
Nada, non ho trovato soluzioni quindi penso che non ci sia modo di ottenere quelle info e quegli eventi.

Non ti rimane che provare il codice di Marco ed eventualmente porre la domanda anche nel forum "internazionale".

Sorry :(:)
 

udg

Expert
Licensed User
Longtime User
porre la domanda anche nel forum "internazionale". Sorry

Per un attimo ho pensato fossimo già nel forum internazionale..eheh
 

udg

Expert
Licensed User
Longtime User
Direi che nella risposta di @MarcoRome ci siano tutti gli elementi necessari ad imbastire quanto desiderato.
Bisogna solo ricordare che:
Chiamate in ingresso: lo stato passa da IDLE a RINGING (quando squilla) a OFFHOOK (quando si risponde) a IDLE ancora (quando si chiude)
Chiamate in uscita: lo stato passa da IDLE a OFFHOOK (quando si compone il recapito telefonico) a IDLE (quando si termina la conversazione).

Quindi bisognerebbe preparare del codice che tenga traccia dei cambiamenti di stato e di conseguenza registri l'orario per capire quanto tempo sia trascorso dal precedente cambio di stato e decidere cosa fare.

Ad esempio, ricevendo OFFHOOK bisogna verificare se lo stato precedente era RINGING (allora vuol dire che si sta rispondendo ad una chiamata in arrivo) oppure IDLE (ad indicare l'inizio di una chiamata in uscita e quindi la necessità di registrare data/ora e far scattare il cronometro).
Quando si riceve IDLE se lo stato precedente era RINGING (segnala chiamata in ingresso persa/non risposta) mentre se era OFFHOOK indica termine di una conversazione (si può discriminare tra conversazione in ingresso o in uscita tramite una variabile boolean da settare nei due casi).

Più o meno è tutto qui. Ovviamente, come al solito, tra il dire e il fare.. eheh

UUUUUHUUUUUUUUUUUUUU
 

LucaMs

Expert
Licensed User
Longtime User
Se lo dici "TE" (è di moda; magari si vogliono mantenere le distanze e non dare del "TU" :D), me fido (c'ho i due neuroni stanchi, nun je la faccio manco a seguire la logica che hai descritto, ma mi fido).

A proposito, ricorDEte di usare altrattanta logica... su Skype :mad:

:)
 
Top