Приемник вещания не вызывается на реальных устройствах - PullRequest
0 голосов
/ 13 января 2020

Я обновил целевую версию с Android 8 до Android 10, после чего я столкнулся с проблемой, что широковещательный приемник не вызывается на устройствах (я тестировал на Samsung s9 (P ie), Mi Note 5 (Oreo)) принимает устройство Google Pixel 2 XL (Android 10), но оно отлично работает на эмуляторе Samsung s9 Genymotion или любом эмуляторе. Кто-нибудь может сказать, что может быть возможной проблемой?

Существует служба под названием SipService, которая регистрирует фильтры намерений, и мы запускаем один из фильтров намерений из одного из действий. Некоторые коды приведены ниже.

ACctivity

внутри метода onCreate ()

 registerReceiver(registrationStateReceiver, new IntentFilter(SipManager.ACTION_SIP_REGISTRATION_CHANGED));
        bindService(new Intent(mContext, SipService.class), connection, Context.BIND_AUTO_CREATE);

И после некоторых вызовов и операций Web-сервиса мы вызываем один из зарегистрированных Intent Filter как ниже.

  Intent intent = new Intent(SipManager.ACTION_SIP_REQUEST_RESTART);
            sendBroadcast(intent);

Внутри класса SipService

private void registerBroadcasts() {
        // Register own broadcast receiver
        if (deviceStateReceiver == null) {
            IntentFilter intentfilter = new IntentFilter();
            intentfilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            intentfilter.addAction(SipManager.ACTION_SIP_ACCOUNT_CHANGED);
            intentfilter.addAction(SipManager.ACTION_SIP_ACCOUNT_DELETED);
            intentfilter.addAction(SipManager.ACTION_SIP_CAN_BE_STOPPED);
            intentfilter.addAction(SipManager.ACTION_SIP_REQUEST_RESTART);
            intentfilter.addAction(DynamicReceiver4.ACTION_VPN_CONNECTIVITY);
            if (Compatibility.isCompatible(5)) {
                deviceStateReceiver = new DynamicReceiver5(this);
            } else {
                deviceStateReceiver = new DynamicReceiver4(this);
            }
            registerReceiver(deviceStateReceiver, intentfilter);
            deviceStateReceiver.startMonitoring();
        }
}

Класс приемника

public class DynamicReceiver4 extends BroadcastReceiver {

    private static final String THIS_FILE = "DynamicReceiver";


    // Comes from android.net.vpn.VpnManager.java
    // Action for broadcasting a connectivity state.
    public static final String ACTION_VPN_CONNECTIVITY = "vpn.connectivity";
    /** Key to the connectivity state of a connectivity broadcast event. */
    public static final String BROADCAST_CONNECTION_STATE = "connection_state";

    private SipService service;


    // Store current state
    private String mNetworkType;
    private boolean mConnected = false;
    private String mRoutes = "";

    private boolean hasStartedWifi = false;


    private Timer pollingTimer;


    /**
     * Check if the intent received is a sticky broadcast one 
     * A compat way
     * @param it intent received
     * @return true if it's an initial sticky broadcast
     */
    public boolean compatIsInitialStickyBroadcast(Intent it) {
        if(ConnectivityManager.CONNECTIVITY_ACTION.equals(it.getAction())) {
            if(!hasStartedWifi) {
                hasStartedWifi = true;
                return true;
            }
        }
        return false;
    }

    public DynamicReceiver4(SipService aService) {
        service = aService;
    }

    @Override
    public void onReceive(final Context context, final Intent intent) {
        // Run the handler in SipServiceExecutor to be protected by wake lock
        service.getExecutor().execute(new SipService.SipRunnable()  {
            public void doRun() throws SipService.SameThreadException {
                onReceiveInternal(context, intent, compatIsInitialStickyBroadcast(intent));
            }
        });
    }



    /**
     * Internal receiver that will run on sip executor thread
     * @param context Application context
     * @param intent Intent received
     * @throws SameThreadException
     */
    private void onReceiveInternal(Context context, Intent intent, boolean isSticky) throws SipService.SameThreadException {
        String action = intent.getAction();
        Log.d(THIS_FILE, "Internal receive " + action);
        if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            ConnectivityManager cm =
                    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            onConnectivityChanged(activeNetwork, isSticky);
        } else if (action.equals(SipManager.ACTION_SIP_ACCOUNT_CHANGED)) {
            final long accountId = intent.getLongExtra(SipProfile.FIELD_ID, SipProfile.INVALID_ID);
            // Should that be threaded?
            if (accountId != SipProfile.INVALID_ID) {
                final SipProfile account = service.getAccount(accountId);
                if (account != null) {
                    Log.d(THIS_FILE, "Enqueue set account registration");
                    service.setAccountRegistration(account, account.active ? 1 : 0, true);
                }
            }
        } else if (action.equals(SipManager.ACTION_SIP_ACCOUNT_DELETED)){
            final long accountId = intent.getLongExtra(SipProfile.FIELD_ID, SipProfile.INVALID_ID);
            if(accountId != SipProfile.INVALID_ID) {
                final SipProfile fakeProfile = new SipProfile();
                fakeProfile.id = accountId;
                service.setAccountRegistration(fakeProfile, 0, true);
            }
        } else if (action.equals(SipManager.ACTION_SIP_CAN_BE_STOPPED)) {
            service.cleanStop();
        } else if (action.equals(SipManager.ACTION_SIP_REQUEST_RESTART)){
            service.restartSipStack();
        } else if(action.equals(ACTION_VPN_CONNECTIVITY)) {
            onConnectivityChanged(null, isSticky);
        }
    }

1 Ответ

1 голос
/ 16 января 2020

На самом деле, плохо, это была проблема ABI (Application Binary Interface), которая вызвала проблему на устройствах с битом 64.

...