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