2012-02-21 9 views
5

Vorrei creare un'applicazione Android in grado di contattare il chiamante corrente tramite un messaggio di testo predeterminato. L'invio di un messaggio di testo è abbastanza semplice, ma determinare il numero di telefono del chiamante corrente in un'applicazione standalone è la sfida. C'è un modo semplice per divinare il numero di telefono in modo da poter inviare loro un messaggio mentre è ancora in corso la chiamata?Come determinare il numero di telefono di un chiamante corrente in un'applicazione standalone

Ovviamente ci sono modi manuali per farlo: annotare il numero, inserirlo in un nuovo messaggio di testo, inserire il messaggio. Ma voglio definire il messaggio in anticipo ed essere in grado di "inviarlo al chiamante corrente".

+0

Si prega di lasciare un po 'di codice su ciò che si è effettivamente provato finora. Cosa non funziona? I miei esempi sembrerebbero fare il trucco. – EGHDK

risposta

4
@Override 
public void onReceive(Context context, Intent intent) { 

    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    PhoneCallStateListener customPhoneListener = new PhoneCallStateListener(context); 
    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
    helper = new ContactDatabaseHelper(context); 
    list = helper.getAllContacts(); 

    try{ 
     incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 

     if (list.size() != 0){ 
      for (int i = 0, size = list.size(); i < size; i++){ 
       if (PhoneNumberUtils.compare(incomingNumber, list.get(i).getContactNumber())){     
        ToastMsg.showToast(context,list.get(i).getContactName()+" Calling"); 
       } 
      } 
     } 


    }catch (Exception e) { 
     // TODO: handle exception 
    } 

} 


public class PhoneCallStateListener extends PhoneStateListener{ 
private Context context; 

public PhoneCallStateListener(Context context){ 
    this.context = context; 
} 

@Override 
public void onCallStateChanged(int state, String incomingNumber) { 

    switch (state) { 

     case TelephonyManager.CALL_STATE_RINGING:  


      break; 
     case PhoneStateListener.LISTEN_CALL_STATE: 

    } 
    super.onCallStateChanged(state, incomingNumber); 
} 
} 
+0

Questo non significa che l'app dovrà essere caricata continuamente per intercettare questi stati di chiamata? –

+2

@ enforcer-99 Non penso che tu capisca il concetto di BroadcastReciever. Ecco la descrizione di StackOverflow: "BroadcastReceiver è un componente Android che risponde agli annunci di trasmissione a livello di sistema." ed ecco il link da google che dovresti * davvero * leggere. Quindi ... stai rispondendo a una trasmissione a livello di sistema e la tua app non è "caricata tutto il tempo". – EGHDK

3

Per la tua sistuation il meglio che posso pensare è usare PhoneStateListener. Contiene il gestore onCallStateChanged. Uno degli argomenti è una stringa contenente il numero di telefono in entrata.

Fonte

: http://developer.android.com/reference/android/telephony/PhoneStateListener.html

Ctrl + F e digitare "In arrivo" e troverete tutto quello che c'è da sapere.

MODIFICA: Per assicurarsi che l'app venga avviata all'avvio del telefono, è sufficiente aggiungere un BroadcastReciever. How to start an Application on startup?

+0

Ma per quanto riguarda il caso in cui l'utente non richiama l'app fino a quando la telefonata è già in corso? Dal momento che non ci sarà alcun cambiamento di stato, non sarei in grado di ottenere il numero corretto? –

+0

Sembra che tu abbia bisogno che la tua app inizi all'avvio. Questo è simile a quello che fanno le app come "Google Wallet". Quando vado in un negozio e tocchi il mio telefono per pagare, non ho mai dovuto aprire il portafoglio Google per farlo funzionare. Tuttavia, quando accendo il mio telefono e guardo le mie notifiche, vedo che "Google Wallet Initializing" è molto veloce e poi scompare. Non ho molto tempo in questo momento, ma forse questo aiuterà: http://stackoverflow.com/questions/5290141/android-broadcastreceiver-on-startup – EGHDK

+0

Cosa succede se ho appena controllato il registro delle chiamate Android? Se ho ordinato l'elenco per data DESC, mostrerebbe la chiamata corrente I am on o la chiamata corrente viene inviata al registro delle chiamate DOPO che la chiamata è stata completata? –

1

Registrare un BroadcastReceiver nel manifest che ascolta ACTION_PHONE_STATE_CHANGED.

Azione intent broadcast che indica che lo stato della chiamata (cellulare) su è cambiato.

Il numero EXTRA_STATE extra indica il nuovo stato della chiamata. Se il nuovo stato è RINGING, un secondo extra EXTRA_INCOMING_NUMBER fornisce il numero di telefono in arrivo come una stringa.

Richiede l'autorizzazione READ_PHONE_STATE.

Questa era una trasmissione appiccicosa nella versione 1.0, ma non è più appiccicosa. Utilizzare invece getCallState() per interrogare in modo sincrono lo stato di chiamata corrente .

In questo modo non è necessario che l'utente avvii l'app prima di ricevere una chiamata.

+0

Che ne pensi di questo? : "A partire da Android 3.1, il sistema Android esclude per impostazione predefinita BroadcastReceiver dalla ricezione di Intents se l'applicazione corrispondente non è mai stata avviata dall'utente o se l'utente ha esplicitamente interrotto l'applicazione tramite il menu Android (in Gestisci applicazione) è una funzionalità di sicurezza aggiuntiva in quanto l'utente può essere sicuro che solo le applicazioni che ha avviato riceveranno gli Intenti di trasmissione. " –

Problemi correlati