2012-10-31 4 views
12

Как мне получить номер телефона, когда на Android-телефоне есть входящий звонок?Как получить номер телефона от входящего звонка?

+0

Вы хотите номер телефона из недавней истории звонков или получить оповещение о входящем звонке? – ckpatel

+0

@ChiragPatel от недавнего входящего вызова –

+1

есть подобный вопрос [здесь] [1] посмотрите [1]: http://stackoverflow.com/questions/1853220/retrieve-incoming-calls- телефон-номер-в-андроиде – Antarix

ответ

26

Сделайте Broadcast receiver сказать ServiceReceiver назначить свое действие в манифесте.

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

Добавить PhoneStateListener в свой TelephonyManager, PhoneStateListener, имеющий переопределение onCallStateChanged() с параметром Входящий номер. Это оно.

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

это требует разрешения?> –

+1

добавил это в манифест, и он работал

1

вы можете найти решение here

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

Это будет вызывающе помочь вам.

Вот реализация, которая позволит вам получить номер телефона, если он является входящим телефонным звонком в качестве входящего номера, а также когда звонок ЗАВЕРШЕН - обратите внимание на код 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; 
     } 

    } 
} 

А потом добавить и инициализацию слушателя в вашем OnCreate или onStartCommand кода:

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

Фактический факт, журнал вызовов вообще не обновляется во время разговора. Только после завершения вызова –

0

Используя принятый ответ, вы зарегистрируете новый слушатель при каждом изменении состояния вызова. Это приведет к нескольким вызовам onCallStateChanged для одного события.

+0

Да, я получаю несколько вызовов. Каково ваше предлагаемое решение? – Basher51

2

Следующее решение помогло мне получить входящие и исходящие номера телефонов.

вещи, чтобы включить в очевидном:

1) Разрешение:

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

2) вещательный приемник:

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

вещь включить в классе 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

Не должно ли оно быть Intent.EXTRA_PHONE_NUMBER? –

+0

EXTRA_PHONE_NUMBER не может быть разрешен или не является полем – rad

Смежные вопросы