Android 瞬时信号强度

Android 瞬时信号强度,android,signal-strength,Android,Signal Strength,我需要找到一种方法来测量Android手机当前的信号强度,而不需要注册PhoneStateListener,天知道它何时返回实际的asu 比如: int signal = getPhoneSignal(); 有什么帮助吗 谢谢 我不认为有办法直接做到这一点。但是您可以注册PhoneStateListener,并将上次更新的值保存到一个变量中,然后返回/调用它 如果您仔细查看Android源代码,您将看到在注册PhoneStateListener后,您将收到即时通知: public void l

我需要找到一种方法来测量Android手机当前的信号强度,而不需要注册PhoneStateListener,天知道它何时返回实际的asu

比如:

int signal = getPhoneSignal();
有什么帮助吗


谢谢

我不认为有办法直接做到这一点。但是您可以注册PhoneStateListener,并将上次更新的值保存到一个变量中,然后返回/调用它

如果您仔细查看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
        }
    }
public void侦听器(PhoneStateListener侦听器,int事件){
字符串pkgForDebug=mContext!=null?mContext.getPackageName():“”;
试一试{
布尔notifyNow=(getITelephony()!=null);
mRegistry.listen(pkgForDebug、listener.callback、events、notifyNow);
}catch(RemoteException-ex){
//系统进程死机
}
}
因此,您可以创建自己的计时器,并在计时器更新时注册新的侦听器,在收到即时更新后,通过传递相同的侦听器对象将其删除,并将事件参数设置为
LISTEN\u NONE

当然,我不能称之为最佳实践,但我能看到的唯一替代方法是根据
getneighborringcellinfo()
中的信号强度自己计算信号强度

p、 s.当将触发
PhoneStateListener
时;)

其中:

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;
    }
}

这是工作代码。不要忘记在清单中注册您的服务并获取权限。可能有更好/更优雅的方法,因此欢迎评论/更正

我试着这么做:活动从主线程调用PhoneStateListener从主线程更新我无法让活动等待PhoneStateListener保存其第一个信号值。。。我遇到了一个死锁:你试试我的解决方案,看看它是否有效?
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;
    }
}