2012-10-31 20 views
12

Jak uzyskać numer telefonu, gdy nadchodzi połączenie w systemie Android?Jak uzyskać numer telefonu z połączenia przychodzącego?

+0

Chcesz numer telefonu z historii ostatnich połączeń lub odbierasz, gdy nadchodzi połączenie alarmowe? – ckpatel

+0

@ChiragPatel od ostatniego połączenia przychodzącego –

+1

jest podobne pytanie [tutaj] [1] spojrzeć [1]: http://stackoverflow.com/questions/1853220/retrieve-incoming-calls- numer telefonu w Androidzie – Antarix

Odpowiedz

26

dokonać Broadcast receiver powiedzieć ServiceReceiver przypisać swoje działania w jawnym.

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

Dodaj PhoneStateListener do TelephonyManager, PhoneStateListener mającego nadpisanie onCallStateChanged() przychodzących parametru liczbowego. To jest to.

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

czy wymaga tego jakieś zezwolenie?> –

+1

dodał to w formie menifestu i działało

1

można znaleźć rozwiązanie here

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

to napewno Ci pomóc.

Oto implementacja, która pozwoli Ci pobrać numer telefonu, jeśli jest to przychodzące połączenie telefoniczne jako numer przychodzący, a także, gdy połączenie jest zakończone - zanotuj kod obsługi().

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; 
     } 

    } 
} 

a następnie dodać i zainicjować słuchacza w kodzie onCreate lub onStartCommand:

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

Rzeczywiście, dziennik połączeń nie jest w ogóle aktualizowany podczas połączenia.Tylko po zakończeniu połączenia –

0

Wykorzystując zaakceptowane odpowiedź, można zarejestrować nowego słuchacza każdej zmianie stanu połączeń. Spowoduje to wiele wywołań onCallStateChanged dla tego samego zdarzenia.

+0

Tak, otrzymuję wiele połączeń. Jakie jest twoje zaproponowane rozwiązanie? – Basher51

2

Następujące rozwiązanie pomogło mi odzyskać przychodzące i wychodzące numery telefonów.

warte to w oczywisty:

1) Licencja:

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

2) Odbiornik transmisji:

<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> 

warte uwzględnienia w klasie 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

Czy nie powinien to być intent.EXTRA_PHONE_NUMBER? –

+0

EXTRA_PHONE_NUMBER nie można rozwiązać lub nie jest polem – rad

Powiązane problemy