Для входящих вызовов нам необходимо использовать класс 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());
}
}
Когда вы удалите приложение, оно автоматически остановит ваш сервис. В другом случае он обнаруживает, что телефонный звонок активен или неактивен.
Как я могу получить состояние телефона при запуске приложения? –
Привет, Тан меня модифицировал код. Пожалуйста, проверьте и дайте мне знать. Спасибо – Jeba
Не достаточно ли просто получить состояние из TelephonyManager? Например. TelephonyManager tm = (TelephonyManager) context.getSystemService (Context.TELEPHONY_SERVICE); return tm.getCallState(); –