2010-12-12 15 views
5

sto usando un intent-filtro per ascoltare i cambiamenti in PHONE_STATECome posso determinare se v'è una chiamata in arrivo sulla "linea 2" (ad esempio, l'avviso di chiamata)

<!-- Listen for phone status changes --> 
    <receiver android:name=".IncomingCallReciever"> 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
    </receiver> 

... e può facilmente rilevare una chiamata in entrata

 intent != null 
    && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED) 
    && intent.hasExtra(TelephonyManager.EXTRA_STATE) 
    && intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING) 

... ma come è possibile determinare se è la linea 1 o la linea 2 che sta squillando?

La mia applicazione ha bisogno di reagire solo quando l'utente è attualmente su una telefonata e un'altra chiamata è in arrivo.

risposta

13

Ho trovato un modo per implementare questo ... distacco per "il prossimo ragazzo".

In poche parole, le mosse di stato del telefono tra tre stati:

  1. 'IDLE' - Tu non sei l'utilizzo del telefono
  2. 'RINGING' - Una chiamata è in arrivo in
  3. 'microtelefono sollevato '- Il telefono è sganciato

Quando viene trasmesso uno stato "RINGING", viene immediatamente seguito da un IDLE o OFF_HOOK per ripristinare lo stato a ciò che era pre-incoming-call.

Mettere tutto insieme e si finisce con questo:

package com.telephony; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 

public class PhoneStateChangedReciever extends BroadcastReceiver { 

    private static String lastKnownPhoneState = null; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent != null && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { 

      //State has changed 
      String newPhoneState = intent.hasExtra(TelephonyManager.EXTRA_STATE) ? intent.getStringExtra(TelephonyManager.EXTRA_STATE) : null; 

      //See if the new state is 'ringing' 
      if(newPhoneState != null && newPhoneState.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 

       //If the last known state was 'OFF_HOOK', the phone was in use and 'Line 2' is ringing 
       if(lastKnownPhoneState != null && lastKnownPhoneState.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
        ... 
       } 

       //If it was anything else, the phone is free and 'Line 1' is ringing 
       else { 
        ... 
       } 
      } 
      lastKnownPhoneState = newPhoneState; 
     } 
    } 
} 
Problemi correlati