2012-10-31 19 views
12

Come ottengo il numero di telefono quando c'è una chiamata in arrivo in Android?Come ottenere il numero di telefono da una chiamata in arrivo?

+0

si desidera il numero di telefono dalla cronologia delle chiamate recenti o ottenere quando avviso chiamata in arrivo? – ckpatel

+0

@ChiragPatel dalla chiamata in arrivo –

+1

c'è una domanda simile [qui] [1] un'occhiata [1]: http://stackoverflow.com/questions/1853220/retrieve-incoming-calls- numero di telefono in Android – Antarix

risposta

26

Fai un Broadcast receiver dire ServiceReceiver assegnare la sua azione in manifesto.

<receiver android:name=".ServiceReceiver" > 
    <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 

Aggiungi un PhoneStateListener al vostro TelephonyManager, PhoneStateListener avendo esclusione onCallStateChanged() con il parametro numero in entrata. Questo è tutto.

ServiceReceiver.Java

public class ServiceReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephony.listen(new PhoneStateListener(){ 
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       super.onCallStateChanged(state, incomingNumber); 
       System.out.println("incomingNumber : "+incomingNumber); 
      } 
     },PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 
+1

richiede l'autorizzazione?> –

+1

aggiunto questo nel manifest e ha funzionato

1

è possibile trovare una soluzione here

Bundle bundle = intent.getExtras(); 
String phoneNr= bundle.getString("incoming_number"); 
1

Questo vi aiuterà con aria di sfida voi.

Ecco un'implementazione che consente di recuperare il numero di telefono se si tratta di una chiamata in arrivo come numero in entrata e anche quando la chiamata è FINITO - prendere nota del codice dell'handler().

private class PhoneCallListener extends PhoneStateListener { 

private boolean isPhoneCalling = false; 

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

    if (TelephonyManager.CALL_STATE_RINGING == state) { 
     // phone ringing 
     Log.i(LOG_TAG, "RINGING, number: " + incomingNumber); 
    } 

    if (TelephonyManager.CALL_STATE_OFFHOOK == state) { 
     // active 
     Log.i(LOG_TAG, "OFFHOOK"); 

     isPhoneCalling = true; 
    } 

    if (TelephonyManager.CALL_STATE_IDLE == state) { 
     // run when class initial and phone call ended, need detect flag 
     // from CALL_STATE_OFFHOOK 
     Log.i(LOG_TAG, "IDLE number"); 

     if (isPhoneCalling) { 

      Handler handler = new Handler(); 

      //Put in delay because call log is not updated immediately when state changed 
      // The dialler takes a little bit of time to write to it 500ms seems to be enough 
      handler.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // get start of cursor 
         Log.i("CallLogDetailsActivity", "Getting Log activity..."); 
         String[] projection = new String[]{Calls.NUMBER}; 
         Cursor cur = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, Calls.DATE +" desc"); 
         cur.moveToFirst(); 
         String lastCallnumber = cur.getString(0); 
       } 
      },500); 

      isPhoneCalling = false; 
     } 

    } 
} 

e quindi aggiungere e inizializzare l'ascoltatore nel codice onCreate o onStartCommand:

PhoneCallListener phoneListener = new PhoneCallListener(); 
TelephonyManager telephonyManager = (TelephonyManager) this 
     .getSystemService(Context.TELEPHONY_SERVICE); 
telephonyManager.listen(phoneListener, 
     PhoneStateListener.LISTEN_CALL_STATE); 
+0

in realtà, il registro delle chiamate non viene aggiornato affatto durante la chiamata. Solo dopo la chiamata è finita –

0

Utilizzando la risposta accettata, si registra un nuovo ascoltatore ad ogni cambio dello stato di chiamata. Risulterà in più chiamate onCallStateChanged per lo stesso evento.

+0

Sì, sto ricevendo più chiamate. Qual è la soluzione proposta quindi? – Basher51

2

La seguente soluzione mi ha aiutato a recuperare i numeri di telefono in entrata e in uscita.

cose da includere nella manifesta:

1) Il permesso:

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 

2) Un ricevitore di broadcast:

<receiver android:name=".AnswerCallBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
</receiver> 

cose da includere in classe BroadcastReceiver:

public class AnswerCallBroadcastReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context arg0, Intent arg1) { 

      if(arg1.getAction().equals("android.intent.action.PHONE_STATE")){ 

       String state = arg1.getStringExtra(TelephonyManager.EXTRA_STATE); 

       if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
        Log.d(TAG, "Inside Extra state off hook"); 
        String number = arg1.getStringExtra(TelephonyManager.EXTRA_PHONE_NUMBER); 
        Log.e(TAG, "outgoing number : " + number);    
       }  

       else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
        Log.e(TAG, "Inside EXTRA_STATE_RINGING"); 
        String number = arg1.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
        Log.e(TAG, "incoming number : " + number); 
       } 
       else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
        Log.d(TAG, "Inside EXTRA_STATE_IDLE"); 
       } 
      } 
     } 
    } 
+0

Non dovrebbe essere Intent.EXTRA_PHONE_NUMBER? –

+0

EXTRA_PHONE_NUMBER non può essere risolto o non è un campo – rad

Problemi correlati