5

私はAndroidの初心者です。

GSM 信号強度をパーセンテージ (1 ~ 100%) で取得するにはどうすればよいですか?

4

4 に答える 4

6

質問したユーザーは、より多くの情報またはフィードバックを提供する必要があります。それは言った...

問題はまったく些細なことではありません。これはデシベル単位のスケールであるため、線形ではなく、信号が低い場合は小さな変化が大きな影響を与え、値が高い場合は大きな変化はあまり重要ではありません。そのため、他のすべての回答は、電話に表示されたものと一致しない不正確な値になると言って申し訳ありません.

すでにオブジェクトがあると仮定するとSignalStrength(そうでない場合は、その方法を示す別の良い答えがあります)、マシュマロでgetGsmLevel()は、線形化されたスケール0〜4を返すメソッド(他のすべての信号用のメソッドもあり、組み合わせたものもあります)で解決されます. クラスからソースコードを確認できますSignalStrength

/**
 * Get gsm as level 0..4
 *
 * @hide
 */
public int getGsmLevel() {
    int level;
    // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
    // asu = 0 (-113dB or less) is very weak
    // signal, its better to show 0 bars to the user in such cases.
    // asu = 99 is a special case, where the signal strength is unknown.
    int asu = getGsmSignalStrength();
    if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
    else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;
    else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;
    else level = SIGNAL_STRENGTH_POOR;
    if (DBG) log("getGsmLevel=" + level);
    return level;
}

0 ~ 100% のスケールは、この問題の粒度が小さいため重要ではありません。そのため、0 ~ 4 の範囲がより一般的に使用され、この方法では既に線形化されています。Marshmallow にない場合は、このメソッドを適応させて、オブジェクトを値として受け取ります。なんらかの理由で 0 ~ 100 の範囲が本当に必要な場合は、dB から線形への変換機能を使用する必要がありますが、GSM 信号のゲイン係数については知りません。

于 2017-01-11T23:17:31.333 に答える
3
    public class MyActivity extends Activity {
    public static final int UNKNOW_CODE = 99;
    int MAX_SIGNAL_DBM_VALUE = 31;

    TelephonyManager tel;
MyPhoneStateListener myPhoneStateListener;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = getLayoutInflater().inflate(R.layout.activity_about, null);
    setContentView(view);

    myPhoneStateListener = new MyPhoneStateListener();
    tel = (TelephonyManager) PpsApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
    tel.listen(myPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}

private class MyPhoneStateListener extends PhoneStateListener {
    /* Get the Signal strength from the provider, each tiome there is an update */
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);

        if (null != signalStrength && signalStrength.getGsmSignalStrength() != UNKNOW_CODE) {
            int signalStrengthPercent = calculateSignalStrengthInPercent(signalStrength.getGsmSignalStrength());
            viewModel.setSignalStrengthString(IntegerHelper.getString(signalStrengthPercent));
        }
    }
}

private int calculateSignalStrengthInPercent(int signalStrength) {
    return (int) ((float) signalStrength / MAX_SIGNAL_DBM_VALUE * 100);
}

}
于 2015-06-05T06:24:30.550 に答える
2

.getGsmSignalStrength(); に注意してください。バーのみを返すようになりました: 0-5,99

実際の値は非表示になりました。リフレクションを使用してそれらに到達することもできます。

                int strength=signalStrength.getGsmSignalStrength();//number of bars not ASU
                Log.v("Mobile","BARS: "+strength);
                try{//Actual signal strength is hidden
                    Class classFromName = Class.forName(SignalStrength.class.getName());
                    java.lang.reflect.Method method = classFromName.getDeclaredMethod("getAsuLevel");//getDbm
                    strength = (int) method.invoke(signalStrength);
                }catch (Exception ex){Log.v("Mobile","cant retreive");}
                if (strength == 99 ) { Log.v("Mobile", "ERROR!  GSM signal strength not available!");return;}//99 = Unknown
                if (strength == 255) { Log.v("Mobile", "ERROR!  UMTS signal strength not available!");return;}//255 = Unknown

上記の例は ASU のみのもので、Dbm よりもうまく機能するようです。ASU 値を取得したら、それをパーセンテージにダンプできます。

                Log.v("Mobile","ASU: "+strength);
                //Data.mobile_signal=strength*20;//Number of bars 0-5
                //Data.mobile_signal = 100-((strength-113)/62);//GSM DBM
                Data.mobile_signal =(int)((double)strength*100/31);//GSM ASU
                Data.mobile_signal =(int)((double)strength*100/91);//UMTS ASU
               Log.v("Mobile","Set GSM signal from "+strength+" to "+Data.mobile_signal);

注意として、これは CDMA 信号ではなく GSM 信号を使用している場合のためのものです。TelephonyManager.getPhoneType(); を使用します。1=GSM、2=CDMA、3=SIP のいずれかを決定します。

ちょっと待って!これは、信号強度が 50% しかないにもかかわらず、バーが 5 つあることを示しています。これは間違っています!

まあ、正確ではありません。携帯電話が送信機の真正面にない限り、おそらく 100% にはなりません。しかし、50% の信号は約 100% の品質です。ですから、ここからクリエイティブにならなければなりません。

于 2016-07-21T17:47:23.337 に答える