2013-05-22 18 views
9

So che questo è già stato chiesto più volte, senza risposte, ma spero ancora che qualcuno abbia finalmente risolto il problema.Rilevamento risposta chiamata in uscita su Android

Il problema: ho un dispositivo non rootato con Android 2.3. Devo creare un servizio che:

  1. fa una telefonata;
  2. attende fino alla risposta della chiamata;
  3. blocca il telefono dopo la risposta alla chiamata (con un timeout);

Come molti altri, sono rimasto bloccato con # 2. Di seguito è riportato il riepilogo delle soluzioni mai suggerito:

  • Usa PhoneStateListener (più popolare): non funziona, per chiamate in uscita non può rilevare quello che mi serve.
  • Utilizzare com.android.internal.telephony.CallManager e i suoi metodi come registerForPreciseCallStateChanged (ad esempio, this one): non funziona, non ci sono telefoni registrati al suo interno, quindi gli eventi non si attivano.
  • Utilizzare com.android.internal.telephony.PhoneFactory per ottenere un'istanza com.android.internal.telephony.Phone (che è la chiave per tutto): non funziona, la fabbrica non è inizializzata; tenta di inizializzarlo con una chiamata makeDefaultPhones in un'eccezione di sicurezza (come here).
  • Rileva la suoneria in uscita (link): l'autore - Dany Poplawec - afferma che la rilevazione di suonerie può aiutare a risolvere il problema, ma non fornisce dettagli, quindi non ho potuto provare questa tecnica.

Sembra che tutto è stato provato già, ma ci può essere ancora un trucco più che mi farà risparmiare :)

+0

Hai trovato qualche soluzione per questo? – Noundla

+0

Purtroppo, sembra che non si possa fare nulla se non modificare il sistema operativo Android stesso. –

risposta

0

Sto cercando di ottenere anche questo e non riesco a trovare alcuna soluzione ancora.

Guardando il codice sorgente di Android ho trovato queste righe in ~/cucina/Jellybean/quadri/opt/telefonia/src/java/com/android/interno/telefonia/Call.java

public enum State { 
    IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING; 

    public boolean isAlive() { 
     return !(this == IDLE || this == DISCONNECTED || this == DISCONNECTING); 
    } 

    public boolean isRinging() { 
     return this == INCOMING || this == WAITING; 
    } 

    public boolean isDialing() { 
     return this == DIALING || this == ALERTING; 
    } 
} 

I credo si potrebbe sapere se una chiamata in uscita è stato risposto verifica dello stato attivo, ma non so come leggere questo valore da un app, forse la modifica del quadro con l'aggiunta di una funzione specifica per questo tipo:

public boolean isActive() { 
     return this == ACTIVE; 
    } 

Questa è solo un'idea, ma non sono sicuro di come implementarlo, perché ovviamente altre modifiche devono essere fatte per accedere a questa nuova funzione dal livello dell'applicazione.

Se trovi questo valido o sai come farlo, l'aiuto e il feedback saranno molto apprezzati.

0

La soluzione nel vostro terzo proiettile dovrebbe essere possibile in dispositivi radicata, se si seguono le istruzioni in Android INJECT_EVENTS permission

Passo dopo passo, è qualcosa di simile:

  1. firma l'applicazione con il certificato piattaforma .Ciò richiede i seguenti passaggi:
    • aggiungere android: sharedUserId = "android.uid.phone" al manifesto-tag delle vostre apk's manifeste.
    • add android: process = "com.android.phone" al tag dell'applicazione del manifest.
    • potrebbe essere necessario aggiungere alcune autorizzazioni extra al manifest e sarà inoltre necessario modificare la gravità per ProtectedPermission nelle "Preferenze Lint Android" del progetto.
    • otteniate platform.pk8 + platform.x509.pem da {source Android}/costruire/target/prodotto/sicurezza (ho usato quelli per 4.4.4r1 in https://android.googlesource.com/platform/build/+/android-4.4.4_r1/target/product/security/)
    • Scarica keytool-importkeypair da https://github.com/getfatday/keytool-importkeypair
    • Utilizzare questo script per ottenere il keystore per la piattaforma con il comando: keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias piattaforma. L'ho eseguito su cygwin, con una piccola modifica della sceneggiatura.
    • Firma l'apk con questo keystore.
  2. installare l'applicazione come un'applicazione sistema utilizzando adb:

    radice ADB

    remount adb

    adb spinta MyApp.apk/system/app

    adb shell chmod 644 /systen/app/MyApp.apk

  3. Riavviare il dispositivo.

Ho effettivamente provato la soluzione nel 2 ° proiettile e non funziona neanche per me (su un Galaxy S5 con KitKat). La soluzione nel terzo elemento del punto elenco funziona abbastanza bene. Indipendentemente dal nome del pacchetto, l'app viene eseguita come com.android.phone, quindi è necessario collegarsi a tale processo se si desidera eseguire il debug dell'applicazione.

+0

Bene, con root sono possibili molte cose. Tuttavia, uno dei miei requisiti chiave era l'utilizzo di un dispositivo di serie senza accesso root. Comunque, grazie per la condivisione, forse utile un giorno :) –

+0

Nelle versioni Android precedenti alla 4.1, è possibile analizzare l'output logcat dall'interno della tua app per la maggior parte degli eventi di chiamata. È davvero una soluzione sporca, ma funzionerebbe su dispositivi non rooted. sfortunatamente, questo non è possibile nelle versioni Android più recenti. – JuanNoguera

Problemi correlati