即时信号强度

时间:2010-10-08 08:11:13

标签: android signal-strength

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

类似的东西:

int signal = getPhoneSignal();

任何帮助PLZ?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您仔细查看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
        }
    }

因此,您可以创建自己的计时器,并在计时器更新寄存器中使用新的侦听器,并在接收到即时更新后通过传递相同的侦听器对象并将events参数设置为LISTEN_NONE来删除它。

当然我不能称之为最佳实践,但我能看到的唯一选择是根据getNeighboringCellInfo()的信号强度自行计算信号强度。

P.S。当PhoneStateListener被触发时Not only God knows;

答案 1 :(得分:1)

我认为没有办法直接这样做。但是您可以注册PhoneStateListener并将最后更新的值保存到变量中并返回/调用它。

答案 2 :(得分:0)

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

这是有效的代码。不要忘记在清单中注册您的服务并获取权限。可能有更好/更优雅的方式这样做,所以欢迎评论/更正。