Jumping Jack Flash weblog

Javaphone API e Motorola a1000 (Symbian UIQ)

Posted in Java, Javaphone API, jython, Motorola a1000, Symbian, Symbian UIQ by jumpjack on 1 febbraio 2007

Il motorola a1000 supporta il Personal Java, il predecessore del “Personal Profile” della piattaforma J2ME. Inoltre, nell’a1000 sono presenti le Javaphone API, librerie java che permettono di accedere a funzioni tipiche del cellulare come rubrica, agenda, SMS… Accedere alle javaphone API tramite Java è piuttosto complicato, essendo piuttosto complicato il java in sè. Ma fortunatamente ci viene in aiuto Python, un linguaggio di scripting, molto piu’ semplice e intuitivo del java, e che permette di “lanciare comandi” anche senza scrivere nessun programma, semplicemente usando una “console”. Il Python supportato dall’a1000 si chiama Jython, che sta per “Python su Java”: in pratica, voi scrivete in Python, e il vostro programma viene interpretato e tradotto in Java, in tempo reale. Questo rende possibili fare cose molto interessanti, come leggere l’IMEI del cellulare, l’IMSI (=numero della carta SIM), effettuare chiamate, inviare SMS. Qui di seguito riporterò man mano le mie scoperte riguardo l’uso delle Javaphone API tramite Jython. Naturalmente ogni commento/suggerimento è benvenuto. Per esempio: è possibile accedere alle “informazioni di cella” con le javaphone API? Da questo link è possibile scaricare JythonQ , il porting di Jython per UIQ: DOWNLOAD JythonQ

Thread di riferimento su Forum Nokia

Programmi di esempio in Jython

Linea di comando per jRun.txt per lanciare script python: -cp D:’jython’awtcons.jar;D:’jython -Dpython.home=d:’jython org.python.util.jython d:’jython’NOMEFILE.py

Leggere livello sel segnale:

>>> import com.symbian.javax.telephony.mobile
>>> mp = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> print mp.getSignalLevel

Effettuare una chiamata “di nascosto”, senza che sia possibile riagganciare!
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> ts = p.getTerminals()
>>> t = ts[0]
>>> tads = t.getAddresses()
>>> tad = tads[0]
>>> mc = p.createCall()
>>> call = mc.connect(t,tad,”numero”)

Leggere il “subscriber ID” (IMSI), ovvero il codice univoco associato dalla rete alla propria USIM:
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> ts = p.getTerminals()
>>> t = ts[0]
>>> tads = t.getAddresses()
>>> tad = tads[0]
>>> m = com.symbian.javax.telephony.mobile.EpocGsmMobileTerminal(tad,p)
>>> mads = m.getAddresses()
>>> m = mads[0]
>>> print m.getSubscriptionId()

Metodo breve per ottenere l’IMSI:
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> print com.symbian.javax.telephony.mobile.EpocMobileAddress(p).getSubscriptionId()

Leggere IMEI:
>>> import com.symbian.epoc.etel
>>> a = com.symbian.epoc.etel.Etel
>>> b= a.getPhone()
>>> print b.getPhoneId().serialNumber

Leggere lo stato della batteria in pecentuale. Purtroppo non funziona: restituisce sempre il valore di default 0x7fff.ffff , come se il cell fosse sempre in carica!
>>> import javax.power.monitor
>>> pm = javax.power.monitor
>>> pmi = pm.PowerMonitor.getInstance()
>>> print pmi.getBatteryLevel()
>>> print pmi.getEstimatedSecondsRemaining()
>>> print pmi.usingExternalPowerSource()

Mandare un SMS a un contatto della rubrica:
>>> import java.lang.String
>>> import javax.net.datagram
>>> jnd = javax.net.datagram
>>> dns = jnd.DatagramNameService
>>> addr = dns.lookupAll(nomedeltizio,”SMS”) (trova tutti i numeri a cui è possibile inviare un SMS, e li mette nell’array addr[] , i cui elementi saranno addr[0], addr[1] ecc…
>>> ds = jnd.DatagramService
>>> serv = ds.getService(addr[0])
>>> mex = java.lang.String(“questo è il messaggio”).getBytes()
>>> d = jnd.Datagram(mex,addr[0])
>>> serv.send(d)

Mandare un SMS a un numero qualunque:
>>> import java.lang.String
>>> import javax.net.datagram
>>> import com.symbian.javax.net.datagram Per poter creare un oggetto Address a partire da una stringa-numero.
>>> jnd = javax.net.datagram
>>> dns = jnd.DatagramNameService
>>> addr = com.symbian.javax.net.datagram.SMSAddress(“+393490000000”)
>>> ds = jnd.DatagramService
>>> serv = ds.getService(addr)
>>> mex = java.lang.String(“questo è il messaggio”).getBytes()
>>> d = jnd.Datagram(mex,addr)
>>> serv.send(d)

Come accedere ai metodi di EtelGsmPhone:
>>> import com.symbian.javax.telephony.mobile
>>> p = com.symbian.javax.telephony.mobile.EpocGsmMobileProvider()
>>> ph = p.getPhone()

Adesso “ph” è di tipo EtelGsmPhone. Si possono quindi usare metodi come:

– getDetectedNetworks() (restituisce array di EtelGsmNetworkInfo, che contiene .status, .code, .shortName, .longName ; sull’a1000 dà “none”: bisogna usare il metodo getAvailableNetowrks di EpocGsmMobileProvider, ma comunque i risultati non sono leggibili (???). Usando invece getCurrentNetwork() di EpocGsmMobileProvider è possibile conoscere la rete attualmente in uso.

getOwnNumbers() (restituisce array di stringhe; dà “-5” (=NOT SUPPORTED) sull’a1000😦 )

getSubscriptionId() (=IMSI)

getPhoneId() (restituisce tipo EtelGsmPhoneId, che contiene .manufacturerId, .modelId, .revisionId, .serialNumber (=IMEI)

getVoiceLines() (restituisce array di EtelGsmLine

Chiamate telefoniche
Per gli esempi che seguono, premettere sempre queste istruzioni:

>>> import com.symbian.javax.telephony

>>> jtp = javax.telephony.JtapiPeerFactory.getJtapiPeer(“”)

>>> p = jtp.getProvider(“EpocGsmMobileProvider”)

– Effettuare una chiamata:

>>> lines = p.getPhone().getVoiceLines()

>>> call = lines[0].newCall()

>>> call.dial(“numero”)

>>> cal.hangup()          per riagganciare 

– Rispondere a una chiamata:

>>> calls = p.getCalls()

>>> call=calls[0]

>>> call.answer()

– Riagganciare (rifiutare?)

>>> call.hangup()

– Leggere il numero del chiamante

>>> print call.getCallerId()

11 Risposte

Subscribe to comments with RSS.

  1. Delsa said, on 15 settembre 2008 at 14:46

    ciao JJ….sono di planetmobile…
    leggo ora questo tuo articolo…
    secondo te..è possibile fare un’interfaccia tutta nuova usando python e le funzioni che hai trovato te?? magari facendola partire automaticamente appena accendi il mattoncino…

    grazie

  2. jumpjack said, on 16 settembre 2008 at 8:21

    non mi ricordo se in jython si puo’ leggere la posizione del pennino sullo schermo, condizione indispensabile per poter realizzare un’interfaccia completa.
    Ma in ogni caso mi sembrerebbe un lavoro enorme da fare…

  3. Delsa said, on 17 settembre 2008 at 13:06

    sarebbe troppo irrealizzabile???

  4. jumpjack said, on 17 settembre 2008 at 13:11

    esatto.

  5. Daniele said, on 10 dicembre 2008 at 15:56

    Ciao sto cercando questo package (com.symbian.javax.telephony) ma non lo trovo. Hai un link da dove posso scaricarlo?
    Grazie

    • jumpjack said, on 10 dicembre 2008 at 16:05

      Credo fosse nel file javaphone.jar trovato o nel SonyEricsson p800 o nell’sdk per UIQ, devo vedere se lo ritrovo.

  6. Daniele said, on 10 dicembre 2008 at 16:08

    Te ne sarei molto grato!

  7. Daniele said, on 11 dicembre 2008 at 12:12

    Ti dirò! Spero davvero che queste classi possano servirmi a qualcosa, per ciò che ho in mente!
    Io sviluppo per lavoro in J2EE e nel tempo libero mi cimento nella programmazione J2ME. La mia intenzione sarebbe integrare (e riuscire a far funzionare) queste classi in una qualsiasi applicazione J2ME, un pò come come avviene anche per i progetti enterprise. Quando mancano delle classi di default nelle librerie della JDK si usano quelle di terze parti.
    Ho fatto molte molte ricerche a riguardo e ora vorrei provare a tirar fuori qualcosa dal mio cappello!!! Vediamo un pò…
    Grazie tantissimo per il link!

    • jumpjack said, on 11 dicembre 2008 at 12:25

      Non credo (ma non ci ho mai provato) che queste classi possano funzionare su una Virtual Machine J2ME, essendo classi di una Virtual Machine PersonalJava, comunque prova….

  8. […] Javaphone API e Motorola a1000 (Symbian UIQ) […]


Puoi inserire un commento qui sotto; diventerà visibile dopo la moderazione dell'amministratore

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: