Не удается получить TelephonyManager.CALL_STATE_RINGING

#android

#Android

Вопрос:

Я добавил, что это мой файл манифеста —

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

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

Тогда мой класс обслуживания выглядит следующим образом —

 public class ServiceReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    MyPhoneStateListener phoneListener = new MyPhoneStateListener();
    TelephonyManager telephony = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
  

}

и мой PhoneStateListener —

 public class MyPhoneStateListener extends PhoneStateListener {

public void onCallStateChanged(int state, String incomingNumber) {
    Log.i("telephony-example", "State changed: "   stateName(state));
}

String stateName(int state) {
    switch (state) {
    case TelephonyManager.CALL_STATE_IDLE:
        Log.d("DEBUG", "***********IDLE********");
        return "Idle";
    case TelephonyManager.CALL_STATE_OFFHOOK:
        Log.d("DEBUG", "***********OFFHOOK********");
        return "Off hook";
    case TelephonyManager.CALL_STATE_RINGING:
        Log.d("DEBUG", "***********RINGING********");
        return "Ringing";
    }
    return Integer.toString(state);
}
  

}

Я могу видеть состояние ожидания.

Но когда я звоню, я не получаю состояние вызова. Почему?

Ответ №1:

Я думаю, вы смешиваете два подхода для получения состояния телефона. Если вы используете фильтр намерений и широковещательный приемник, то в приемнике нет необходимости вызывать функцию прослушивания TelephonyManager(). Просто проверьте полученное намерение следующим образом :

 public void onReceive(Context context, Intent intent) {
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
    String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
    if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
    {
        Log.d("MPR", "Its Ringing ["   number   "]");
    }
    if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
    {
        Log.d("MPR", "Its Idle");
    }
    if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
    {
        Log.d("MPR", "Its OffHook");
    }
}
  

Комментарии:

1. Спасибо … получил звонок 🙂 Кстати, вы знаете, как заставить его приостанавливать мое приложение, когда звонит телефон, а затем вернуться к приложению, когда телефонный звонок завершен?

2. AFAIK, если ваше приложение выполняет какое-либо действие, будут вызваны его onPause и onStop, чтобы получить информацию об активности телефона. Если вы запускаете службу, я не вижу причины, по которой вы хотите приостановить выполняемую вами работу. Тем не менее, если вы хотите использовать вышеуказанный метод, чтобы узнать, когда звонит телефон, а затем, в зависимости от логики вашего приложения, прекратить выполнение работы и возобновить позже, но я не понимаю, зачем вам делать это из службы!

3. ну, проблема в том, что у меня играет песня, но она не останавливается, когда звонит телефон, поэтому я спросил.

4. о .. хорошо. Тогда просто используйте этот механизм и остановите песню!

5. @nasaa вы также можете запросить AudioFocus и остановить воспроизведение песни таким образом (при потере фокусировки звука).