2011-07-10 2 views
1

Я пытаюсь использовать BroadcastReceiver для приема входящих звонков. Я хочу зарегистрировать вызов, когда вызов завершен. Ниже код дает каждому состоянию (бездействующий, звонящий n offhook) более одного раза с тем же номером (это не проблема прошлого вызова). Это потому, что phonestatelistner вызывается внутри службы.Широковещательный приемник и phonestatistist

public class IncomingCallReceiver extends BroadcastReceiver { 

int stateString =0; 
int prevStat = 0; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
      Bundle bundle = intent.getExtras(); 

      if(null == bundle) 
        return; 

      String state = bundle.getString(TelephonyManager.EXTRA_STATE); 

      if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) 
      { 
        String phonenumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 

        String info = "Detect Calls sample application\nIncoming number: " + phonenumber; 

        Toast.makeText(context, info, Toast.LENGTH_LONG).show(); 
      } 

      TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
      //CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); 

      PhoneStateListener listener = new PhoneStateListener() { 

      @Override 
       public void onCallStateChanged(int state, String incomingNumber) { 
        String p = incomingNumber; 
        switch (state) { 
        case TelephonyManager.CALL_STATE_IDLE: 
        prevStat = stateString; 
        stateString = 1; 
        Log.i("ON CALL STATE CHANGED","IDLE"); 
        break; 
        case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.i("ON CALL STATE CHANGED","OFFFHOOK"); 
        prevStat = stateString; 
        stateString = 2; 
        break; 
        case TelephonyManager.CALL_STATE_RINGING: 
        prevStat = stateString; 
        stateString = 3; 
        Log.i("ON CALL STATE CHANGED","RINGING"); 
        break; 
        } 

        if(prevStat == 2 && stateString == 1) 
        { 
          Log.i("REGISTER A CALLL","==" +p); 
        } 

      } 
      }; 

       telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 
    } 

    } 

Я также попробовал то же самое с phonestatelistener в отдельном классе, но это не называют, то есть мой код не добраться туда. В моем файле манифеста я зарегистрировал приемник, но не существует декларации о том, как установить фонотектор. Это нужно зарегистрировать?

Прошу прощения, если решение совершенно очевидно, но я новичок в андроидах. Любая помощь приветствуется :)

+0

Проверить этот ответ: http://stackoverflow.com/a/5949116/438466 – Rabi

+0

Убедитесь, что вы открыли приложение после его установки. Приложения находятся в состоянии остановки, пока пользователь явно не откроет приложение. Посмотрите: http://stackoverflow.com/a/9955247/786462 Это может сделать его похожим на то, что ваш BroadcastReceiver не вызывается. – DataDino

ответ

0

Да, выбрать слушателя или получены, но не оба из них

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