Мгновенная сила сигнала - PullRequest
1 голос
/ 08 октября 2010

Мне нужно найти способ измерить текущую мощность сигнала телефона Android, без необходимости регистрировать PhoneStateListener, который Бог знает, когда он возвращает фактическое значение asu.

что-то вроде:

int signal = getPhoneSignal();

любая помощь плз?

спасибо!

Ответы [ 3 ]

2 голосов
/ 08 октября 2010

Если вы ближе познакомитесь с источниками Android, то увидите, что после регистрации PhoneStateListener вы получите мгновенное уведомление:

public void listen(PhoneStateListener listener, int events) {
        String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
        try {
            Boolean notifyNow = (getITelephony() != null);
            mRegistry.listen(pkgForDebug, listener.callback, events, notifyNow);
        } catch (RemoteException ex) {
            // system process dead
        }
    }

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

Конечно, я не могу назвать это лучшей практикой, но единственная альтернатива, которую я вижу, - это рассчитать уровень сигнала самостоятельно, основываясь на уровнях сигнала от getNeighboringCellInfo().

p.s. Не только Бог знает , когда сработает PhoneStateListener; *

1 голос
/ 08 октября 2010

Я не думаю, что есть способ сделать это напрямую.Но вы можете зарегистрировать PhoneStateListener и сохранить последнее обновленное значение в переменную и вернуть / вызвать это.

0 голосов
/ 08 июля 2013
class Signal {

    static volatile CountDownLatch latch;
    static int asu;
    private final static String TAG = Signal.class.getName();

    int getSignalStrength(Context ctx) throws InterruptedException {
        Intent i = new Intent(TAG + ".SIGNAL_ACTION", Uri.EMPTY, ctx,
                SignalListenerService.class);
        latch = new CountDownLatch(1);
        asu = -1;
        ctx.startService(i);
        Log.w(TAG, "I wait");
        latch.await();
        ctx.stopService(i);
        return asu;
    }
}

где:

public class SignalListenerService extends Service {

    private TelephonyManager Tel;
    private SignalListener listener;
    private final static String TAG = SignalListenerService.class.getName();

    private static class SignalListener extends PhoneStateListener {

        private volatile CountDownLatch latch;

        private SignalListener(CountDownLatch la) {
            Log.w(this.getClass().getCanonicalName(), "CSTOR");
            this.latch = la;
        }

        @Override
        public void onSignalStrengthChanged(int asu) {
            Signal.asu = asu;
            latch.countDown();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.w(TAG, "Received : " + intent.getAction());
        Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        listener = new SignalListener(Signal.latch);
        @SuppressWarnings("deprecation")
        final int listenSs = PhoneStateListener.LISTEN_SIGNAL_STRENGTH;
        Tel.listen(listener, listenSs);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        Log.w(TAG, "onDestroy");
        Tel.listen(listener, PhoneStateListener.LISTEN_NONE);
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

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

...