web-dev-qa-db-ja.com

Androidで信号強度を取得

API呼び出しを行った時点でデバイスの信号強度を取得したい。関連するすべてのスレッドを検索しましたが、まだ成功していません。

だから私はのような信号強度を取得したいと思います

SignalStrength ss = null  ; // some initialization

int n = ss.getGsmSignalStrength();

しかし、これを使用していると、SignalStrengthをヌルとして初期化したため、ヌルポインター例外が発生することは明らかです。しかし、これを初期化する方法がわかりません。

また、PhoneStateListenerを使用したくないのは、信号が変化した場合にのみトリガーされるためです。

以下のコードを使用して信号強度を取得しています

TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
CellInfoGsm cellinfogsm = (CellInfoGsm)telephonyManager.getAllCellInfo().get(0);
CellSignalStrengthGsm cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength();
cellSignalStrengthGsm.getDbm();

ただし、CellSignalStrengthはAPIレベル17でのみ追加され、17歳未満では機能しないため、使用したくありません。APIレベル7+でコードを機能させたいです。

または、API呼び出しに到達した時点で信号強度を取得できるように、他の方法がありますか?

23
VIGNESH

変数の定義:

TelephonyManager mTelephonyManager;
MyPhoneStateListener mPhoneStatelistener;   
int mSignalStrength = 0;

次に、このクラスをコードに追加します。

class MyPhoneStateListener extends PhoneStateListener {

     @Override
     public void onSignalStrengthsChanged(SignalStrength signalStrength) {
         super.onSignalStrengthsChanged(signalStrength);
         mSignalStrength = signalStrength.getGsmSignalStrength();
         mSignalStrength = (2 * mSignalStrength) - 113; // -> dBm           
     }
 }

onCreateメソッドでは次を使用します。

mPhoneStatelistener = new MyPhoneStateListener();
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyManager.listen(mPhoneStatelistener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
25
Ingo

グローバル定義:

TelephonyManager telephonyManager;
myPhoneStateListener psListener;
TextView txtSignalStr;

onCreateメソッド:

@Override
protected void onCreate(final Bundle savedInstanceState) {
 txtSignalStr = (TextView)findViewById(R.id.signalStrength);
 psListener = new myPhoneStateListener();
 telephonyManager = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
 telephonyManager.listen(psListener,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}

myPhoneStateListenerクラスを作成します。

public class myPhoneStateListener extends PhoneStateListener {
    public int signalStrengthValue;

    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        if (signalStrength.isGsm()) {
            if (signalStrength.getGsmSignalStrength() != 99)
                signalStrengthValue = signalStrength.getGsmSignalStrength() * 2 - 113;
            else
                signalStrengthValue = signalStrength.getGsmSignalStrength();
        } else {
            signalStrengthValue = signalStrength.getCdmaDbm();
        }
        txtSignalStr.setText("Signal Strength : " + signalStrengthValue);
    }
}
6
reegan29
public class PhoneCustomStateListener extends PhoneStateListener {

    public int signalSupport = 0;

    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);

        signalSupport = signalStrength.getGsmSignalStrength();
        Log.d(getClass().getCanonicalName(), "------ gsm signal --> " + signalSupport);

        if (signalSupport > 30) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Good");


        } else if (signalSupport > 20 && signalSupport < 30) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Avarage");


        } else if (signalSupport < 20 && signalSupport > 3) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Weak");


        } else if (signalSupport < 3) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Very weak");


        }
    }
}
4
vrbsm

Phonelistenerを使用して、onSignalStrengthsChanged(SignalStrength signalStrength)メソッドをオーバーライドする代わりに、signalstrengthを初期化しないでください。

たとえば、次のコードスニペットをご覧ください

class SamplePhoneStateListener extends PhoneStateListener {

        int signalStrength = 0;

        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            signalStrength = signalStrength.getGsmSignalStrength();
            //You can check the signal strength value here..
        }

    }

telephonyManagerオブジェクトを使用して、上記のクラスを聞くことができます

TelephonyManagerObject.listen(myListener,
            PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
3
Sid

これは私のために働いた:

必要なサービス:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

メトリックを収集する方法:

public void startGatherMetrics() {
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo != null) {
        networkInfoStr = connectivityManager.getActiveNetworkInfo().toString();

        // gather Network Capabilities
        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.M) {
            Network network = connectivityManager.getActiveNetwork();
            networkInfoStr += "; " + connectivityManager.getNetworkCapabilities(network).toString();
        }
    }
    Log.d("A_NETWORK_INFO", networkInfoStr);

    new Thread(new Runnable() {
        @Override
        public void run() {
            quitLooper = false;
            Looper.prepare();
            telephonyManager.listen(new PhoneStateListener() {
                @Override
                public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                    super.onSignalStrengthsChanged(signalStrength);
                    Log.d("A_NETWORK_METRICS",
                        "Signal Strength (0-4 / dBm):" + getLevel(signalStrength) + " / "
                            + getDbm(signalStrength));

                    if (quitLooper)
                        Looper.myLooper().quit();
                }
            }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

            Looper.loop();
        }
    }).start();

}

public void stop() {
    quitLooper = true;
}

getLevel(signalStrength)」および「getDbm(signalStrength) "が見つかりました here

SignalStrengthをインスタンス化することはありません(場合によってはできません)。アプリケーションコードから。

PhoneStateListener(サブクラス)を使用し、onSignalStrengthsChangedを実装する必要があります。

http://developer.Android.com/reference/Android/telephony/PhoneStateListener.html#onSignalStrengthsChanged(Android.telephony.SignalStrength)

SignalStrengthが作成され、オーバーライドに渡されます。

1
user2579822

PhoneStateListenerオブジェクトは、ルーパースレッドでインスタンス化する必要があります。そのため、ワーカースレッド(非GUIスレッド)を使用している場合、以下を使用できます。

private HandlerThread handlerThreadCellularSignal = null;

public void startListen() {     
        handlerThreadCellularSignal = new HandlerThread("CELLULAR_INFO_THREAD");
        handlerThreadCellularSignal.start();
        Looper looper = handlerThreadCellularSignal.getLooper();
        Handler handler = new Handler(looper);
        handler.post(new Runnable() {
            @Override
            public void run() {
                phoneStatelistener = new PhoneStateListenerEx();
                TelephonyManager telephonyManager = (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
                telephonyManager.listen(phoneStatelistener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
            }
        });
}

private void stopListen() {
    handlerThreadCellularSignal.quit();
}


public class PhoneStateListenerEx extends PhoneStateListener {

    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        int signalStrengthdBm = (2 * signalStrength.getGsmSignalStrength()) - 113; // -> dBm
        Log.d("Cellular Signal Strength | " + String.valueOf(signalStrengthdBm));
    }
}
0
Samantha