Italian Intercettare le chiamate

Fabius

New Member
Ciao,
ho da poco iniziato a programmare per Android senza conoscenze di java ma con buona esperienza sul Vb pertanto mi sono orientato su basic4a.
Vorrei realizzare un'applicazione che intercetta le chiamate in arrivo simile alle varie blacklist che si trovano sul market.
Ho guardato l'esempio con SmsInterceptor ma non ho trovato niente di analogo in basic4a.
Ho guardato la libreria phone e in particolare PhoneStateChanged (State As String, IncomingNumber As String, Intent As Intent) ma la documentazione è un po' scarna.
Qualcuno ha idea di come fare ?
Grazie
Fabio
 

genesi

Active Member
Licensed User
Longtime User
Devi usare un servizio.
Riporto un frammento di codice di Erel
B4X:
'Service module
Sub Process_Globals
    Dim PE As PhoneEvents
 End Sub
Sub Service_Create
    PE.Initialize("PE")
End Sub

Sub Service_Start

End Sub

Sub PE_PhoneStateChanged (State As String, IncomingNumber As String, Intent As Intent)
 
'Qui in IncomingNumber hai il numero chiamante
End Sub
Sub Service_Destroy
    
End Sub
Mario
 

Fabius

New Member
Ringrazio ma il codice postato non funziona.
Ho trovato invece questo da utilizzare ovviamente in un service.

B4X:
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.
   Dim Pe As PhoneEvents
   Dim Phoneid1 As PhoneId
   Dim Lista As List
   Dim N1 As String
   Dim Caller As String
End Sub
Sub Service_Create
Pe.InitializeWithPhoneState("Pe",Phoneid1)
Lista.Initialize
N1 = ("333xxxxxxxxx")
Log("Service created")
End Sub

Sub Service_Start (StartingIntent As Intent)

Log("Service started")
End Sub

Sub Service_Destroy

End Sub


Sub PE_PhoneStateChanged (State As String, IncomingNumber As String, Intent As Intent)
Log ( "statechnaged " & State & " " & IncomingNumber )
Log ("intent " & Intent )
If IncomingNumber.Contains(N1) Then 
   Caller = IncomingNumber
   CallSubDelayed2(Main,"InfoCall",IncomingNumber)
   
   KillCall
End If
End Sub

Sub KillCall
    Dim r As Reflector
    
   r.Target = r.GetContext
    Dim TelephonyManager, TelephonyInterface As Object
    TelephonyManager = r.RunMethod2("getSystemService", "phone", "java.lang.String")
    r.Target = TelephonyManager
    TelephonyInterface = r.RunMethod("getITelephony")
    r.Target = TelephonyInterface
    r.RunMethod("endCall")
End Sub

Il codice fa uso della libreria reflector che permette di richiamare da Basic oi metodi delle classi java.
Funziona anche se a volte c'è un mezzo squillo prima di rifiutare la chiamata, ma penso sia un problema difficilmente risolvibile.
Fabio
 

ivanomonti

Expert
Licensed User
Longtime User
Ciao Fabio,
ti confermo che non riesci ad eliminare il primo squillo.
Per altro sto terminando un app che comprende le blacklist e le white list.
A breve dovrei pubblicarla :D

Voglio se possibile :)
 

Fabius

New Member
Ciao Fabio,
ti confermo che non riesci ad eliminare il primo squillo.
Per altro sto terminando un app che comprende le blacklist e le white list.
A breve dovrei pubblicarla :D

Beh un modo ci sarebbe :
1)l'applicazione appena avviata modifica le impostazioni del telefono mettendolo su silenzioso
2) quando arriva una chiamata questa viene intercettata e se non è in blacklist l'applicazione mette il telefono su suono
3) terminata la conversazione il telefono ritorna su silenzioso

Non saprei però come gestire le scelte dell'utente che ovviamente potrebbe mettere lui il telefono su silenzioso e desiderare che ci resti per tutte le chiamate.
Fabio
 

Dominex

Active Member
Licensed User
Longtime User
Non è complicato gestire il volume della suoneria via codice. Con la libreria Phone hai a disposizione tutti i mezzi.

Io per TapDroid azzero il volume di sistema all'avvio, così si possono sentire senza interferenza i suoni del gioco, e all'uscita reimposto il volume al valore originario.

Inviato da mio Samsung Galaxy S II
 
Top