2014-02-08 5 views
2

Я делаю приложение, которое необходимо определить для телефонного звонка onCreate. Если получен телефонный звонок, мое приложение должно скрываться в фоновом режиме. Я использовал PhoneStateListener. Однако он активируется только при изменении статуса телефона.Обнаружение состояния телефона OnCreate

Как я могу определить состояние телефона на функции onCreate?

ответ

2

Для входящих вызовов нам необходимо использовать класс TelephonyManager, и его метод прослушивает регистрацию прослушивателя, который будет принимать состояние вызова, подключение к данным, сеть, SIM и другие события, связанные с телефонией. Нас интересуют только уведомления о состоянии звонка. Для этого требуется разрешение android.permission.READ_PHONE_STATE.

Таким образом, создать наш слушатель класс, производный от PhoneStateListener, и переопределить onCallStateChanged метод следующим образом:

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class PhoneState extends Service { 
    private CallStateListener mCallStateListener = new CallStateListener(); 
    private TelephonyManager mTelephonyManager; 
    private int mCallState; 

    @Override 
    public void onCreate() { 
    super.onCreate(); 
    mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
    mCallState = mTelephonyManager.getCallState(); 
    mTelephonyManager.listen(mCallStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
    } 

    @Override 
    public void onDestroy() { 
     Log.d("onDestroy", "onDestroy"); 
    mTelephonyManager.listen(mCallStateListener, PhoneStateListener.LISTEN_NONE); 
    super.onDestroy(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; //-- not a bound service-- 
    } 

    private final class CallStateListener extends PhoneStateListener { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     switch (mCallState) { 

      case TelephonyManager.CALL_STATE_IDLE: 
       if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
        Log.d("state", "idle --> off hook = new outgoing call"); 
        // idle --> off hook = new outgoing call 
        //triggerSenses(Sense.CallEvent.OUTGOING); 
       } else if (state == TelephonyManager.CALL_STATE_RINGING) { 
        Log.d("state", "idle --> ringing = new incoming call"); 
        // idle --> ringing = new incoming call 
        //triggerSenses(Sense.CallEvent.INCOMING); 
       } 
       break; 

      case TelephonyManager.CALL_STATE_OFFHOOK: 
       if (state == TelephonyManager.CALL_STATE_IDLE) { 
        Log.d("state", "off hook --> idle = disconnected"); 
        // off hook --> idle = disconnected 
        //triggerSenses(Sense.CallEvent.ENDED); 
       } else if (state == TelephonyManager.CALL_STATE_RINGING) { 
        Log.d("state", "off hook --> ringing = another call waiting"); 
        // off hook --> ringing = another call waiting 
        //triggerSenses(Sense.CallEvent.WAITING); 
       } 
       Log.d("CALL_STATE_OFFHOOK", String.valueOf(state)); 
       break; 

      case TelephonyManager.CALL_STATE_RINGING: 
       if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
        Log.d("state", "ringing --> off hook = received"); 
        // ringing --> off hook = received 
        //triggerSenses(Sense.CallEvent.RECEIVED); 
       } else if (state == TelephonyManager.CALL_STATE_IDLE) { 
        Log.d("state", "ringing --> idle = missed call"); 
        // ringing --> idle = missed call 
        //triggerSenses(Sense.CallEvent.MISSED); 
       } 
       break; 
     } 

     mCallState = state; 
    } 
    } 

    public static void init(Context c) { 
     c.startService(new Intent(c, PhoneState.class)); 
    Log.d("Service enabled","Service enabled: " + true); 
    } 
} 

В вашей основной деятельности вы просто запустить службу Phonestate как,

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 

public class SpinnerSample extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    PhoneState.init(getBaseContext()); 
    } 
} 

Когда вы удалите приложение, оно автоматически остановит ваш сервис. В другом случае он обнаруживает, что телефонный звонок активен или неактивен.

+0

Как я могу получить состояние телефона при запуске приложения? –

+0

Привет, Тан меня модифицировал код. Пожалуйста, проверьте и дайте мне знать. Спасибо – Jeba

+0

Не достаточно ли просто получить состояние из TelephonyManager? Например. TelephonyManager tm = (TelephonyManager) context.getSystemService (Context.TELEPHONY_SERVICE); return tm.getCallState(); –

0

Он имеет два steps.Firstly, вы должны иметь слушатель, который расширяет изменения состояния телефона PhoneStateListener.When, это будет касаться onCallStateChanged.The телефона имеет три состояния: CALL_STATE_RINGING, CALL_STATE_IDLE и CALL_STATE_OFFHOOK.You может обнаружить этот states.Secondly , как вы говорите, ему также нужен широковещательный приемник. Вы можете скрыть свой APP в фоновом режиме. И последнее, но не менее важное: не забудьте зарегистрировать приемник и прочитать разрешение на доступ к телефону в AndroidManifest.xml.

+0

Извините, я заявил неправильно. Я использовал PhoneStateListener, он прослушивает состояния телефона, но то, что я хочу, - это когда приложение открыто, оно должно определить, звонит ли телефон. PhoneStateListener не запускается, когда приложение открыто, только когда состояние телефона изменилось. –

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