Приемник не работает, когда закрытое приложение - PullRequest
0 голосов
/ 21 октября 2019

При входящем звонке на телефон всплывающее окно. Приложение работает, когда оно открыто. Однако, когда я полностью закрываю приложение, телефон не показывает всплывающее окно, даже если есть голосовой вызов. Приемник вещания не работает после закрытия приложения.

Мое устройство - Xiaomi Mi8

Это мой код:

public class CallBarring extends BroadcastReceiver {

    private CustomDialog dialog;
    private TelephonyManager telephonyManager;
    private PhoneStateListener listener;
    private Context context;
    private Button btnEndCall;
    private TextView incomingNumberName;
    private List<String> data;

    final NumberInfo numberInfo = new NumberInfo();
    Retrofit retrofit = NetworkClient.getRetrofitClient();
    NumberAPI numberAPI = retrofit.create(NumberAPI.class);
    @Override
    public void onReceive(Context context, Intent intent) {

        if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
            return;

        else {
            this.context = context;
            if(dialog == null){
                dialog = new CustomDialog(context);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
                }else{
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
                dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
                dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
                dialog.show();
            }
            // Fetch the number of incoming call
            telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            listener = new PhoneStateListener() {
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    String stateString = "N/A";
                    switch (state) {
                        case TelephonyManager.CALL_STATE_IDLE:
                            stateString = "Idle";
                            dialog.dismiss();
                            break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:
                            stateString = "Off Hook";
                            dialog.dismiss();
                            break;
                        case TelephonyManager.CALL_STATE_RINGING:
                            stateString = "Ringing";
                            dialog.show();
                            break;
                    }
                }
            };

            telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
            telephonyManager.listen(new PhoneStateListener(){
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    super.onCallStateChanged(state, incomingNumber);
                    System.out.println("incomingNumber : "+incomingNumber);
                    fetchUserInfo(incomingNumber);


                }
            },PhoneStateListener.LISTEN_CALL_STATE);

        }
    }

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вы, кажется, регистрируете своего широковещательного приемника в Activity (я предполагаю). Это означает, что ваш приемник работает только тогда, когда активность активна. Но когда действие умирает, получатель становится незарегистрированным и поэтому не будет ничего слушать.

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

<receiver
    android:name=".CallBarring"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

документы: декларируют заявленные получатели

0 голосов
/ 21 октября 2019

Многие устройства Android имеют концепцию управления питанием и режим дозирования. поэтому фоновые функции останавливаются, когда приложение находится в фоновом режиме.

Вы можете использовать службу переднего плана, чтобы зарегистрировать свой BroadcastReceiver для прослушивания PHONE_STATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...