我需要找到一种方法来测量Android手机的当前信号强度,而不需要注册一个上帝知道何时返回实际的asu的PhoneStateListener。
类似的东西:
int signal = getPhoneSignal();
任何帮助PLZ?
谢谢!
答案 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;
}
}
这是有效的代码。不要忘记在清单中注册您的服务并获取权限。可能有更好/更优雅的方式这样做,所以欢迎评论/更正。