1

実際のasuを返すときに神が知っているPhoneStateListenerを登録する必要なしに、Androidフォンの現在の信号強度を測定する方法を見つける必要があります。

何かのようなもの:

int signal = getPhoneSignal();

ヘルプplzはありますか?

ありがとう!

4

3 に答える 3

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

したがって、独自のタイマーを作成し、タイマー更新時に新しいリスナーを登録し、インスタント更新を受信した後、同じリスナー オブジェクトを渡してイベント引数を に設定することでそれを削除できますLISTEN_NONE

もちろん、ベストプラクティスとは言えませんが、私が見ることができる唯一の代替手段は、からの信号強度に基づいて自分で信号強度を計算することgetNeighboringCellInfo()です。

ps神だけがいつPhoneStateListenerトリガーされるかを知っているわけではありません;)

于 2010-10-08T09:47:20.457 に答える
1

直接行う方法はないと思います。ただし、PhoneStateListener を登録し、最後に更新された値を変数に保存して、これを返す/呼び出すことができます。

于 2010-10-08T09:15:05.157 に答える
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;
    }
}

これは作業コードです。サービスをマニフェストに登録し、権限を取得することを忘れないでください。これを行うためのより良い/よりエレガントな方法があるかもしれないので、コメント/修正を歓迎します.

于 2013-07-08T18:23:07.003 に答える