我需要找到一种测量Android手机当前信号强度的方法,而不需要注册一个天知道什么时候返回实际asu的PhoneStateListener。
就像是:
int signal = getPhoneSignal();
有什么帮助吗?
谢谢!
我需要找到一种测量Android手机当前信号强度的方法,而不需要注册一个天知道什么时候返回实际asu的PhoneStateListener。
就像是:
int signal = getPhoneSignal();
有什么帮助吗?
谢谢!
如果您仔细查看 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()
。
ps不仅天知道什么时候PhoneStateListener
会触发;)
我不认为有办法直接做到这一点。但是您可以注册 PhoneStateListener 并将最后更新的值保存到变量中并返回/调用它。
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;
}
}
这是工作代码。不要忘记在清单中注册您的服务并获取权限。可能有更好/更优雅的方式来做这件事,所以欢迎评论/更正。