Instant signal strength

后端 未结 3 2048
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-20 08:31

I need to find a way to measure the current signal strength of Android phone, without the need to register a PhoneStateListener that God knows when it returns the actual asu

3条回答
  •  北海茫月
    2020-12-20 08:46

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

    where :

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

    This is working code. Do not forget to register your services in the manifest and acquire permissions. There may be better/ more elegant ways of doing this so comments/corrections welcome.

提交回复
热议问题