TelephonyManager getstate() возвращает ноль в android

В своем приложении я хочу вести журнал состояния, когда кто-то берет трубку. Функция getState() в операторе switch должна возвращать правильное состояние вызова, но всегда возвращает ноль. Вот мой метод onRecieve():

  public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
        incomingFlag = false;
        String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
        Log.i(TAG, "call OUT:"+phoneNumber);
        TelephonyManager tm =
                (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
        Log.e("log state", String.valueOf(tm.getCallState()));
        switch (tm.getCallState()) {
            case TelephonyManager.CALL_STATE_RINGING:
                incomingFlag = true;
                incoming_number = intent.getStringExtra("incoming_number");
                Log.i(TAG, "RINGING :"+ incoming_number);
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                if (incomingFlag){
                    Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
                }
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                if (incomingFlag){
                    Log.i(TAG, "incoming IDLE");
                }
                break;
                default:
                    Log.e("ds","Error");
        }
    }

файл манифеста:

     <activity android:name = ".MainActivity">
        <intent-filter>
            <action android:name = "android.intent.action.MAIN" />

            <category android:name = "android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name = ".BroadCast" >
        <intent-filter>
            <action android:name = "android.intent.action.PHONE_STATE" />
        </intent-filter>
        <intent-filter>
            <action android:name = "android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>

Разрешения:

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

Упомянутый выше метод onCreate() находится в отдельном созданном мной классе под названием BroadCast, и я вызываю его, создавая новый экземпляр.

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

как насчет разрешений?

code4rox 02.02.2019 05:19

вопрос обновлен бро

Siva Perumal 02.02.2019 05:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
235
1

Ответы 1

Попробуйте использовать BroadcastReceiver для обработки входящего вызова. В вашем onResume настройте приемник

IntentFilter filter2 = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter2.setPriority(99999);
this.registerReceiver(incomingCallReceiver, filter2);

и обрабатывать его, например

BroadcastReceiver incomingCallReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle bundle = intent.getExtras();
        if (bundle == null) return;
        // Incoming call

        // Get the state
        String state = bundle.getString(TelephonyManager.EXTRA_STATE);

        // Process the states
        if ((state != null) &&  (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))) {
            // Ringing State
        }
        if ((state != null) &&  (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE))) {
            // Idle State
        }
        if ((state != null) &&  (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK))) {
            // Offhook State
        }
    }
};

как я могу получить состояние? Я новичок в BroadcastReceiver.

Siva Perumal 02.02.2019 07:17

Информация о состоянии получается через связанные данные EXTRA. Я добавил проверки для ваших исходных состояний.

Mark JW 02.02.2019 18:16

Другие вопросы по теме