Detecting “use only 2G networks” setting

前端 未结 2 1268
面向向阳花
面向向阳花 2021-02-09 05:36

Is there a way of returning the value of Android\'s mobile network setting for \"use only 2G networks\"?

The app being developed measures the internet speed at a certain

相关标签:
2条回答
  • 2021-02-09 06:15

    For a small subset of devices (specifically for the LG Optimus 2X Speed, LG-P990), an answer seems to be:

    int enabled = Settings.Secure.getInt(getContentResolver(),
            "preferred_network_mode", -1);
    Log.d("MYAPP", "2G only enabled: " + enabled);
    

    Where the "use only 2G networks" setting is specified as:

    • 0 indicates the setting is disabled
    • 1 indicates the setting is enabled
    • -1 indicates the setting is not set (some devices?)

    How I discovered this? I gathered all the key/value pairs from Settings.Secure using the following:

    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(Settings.Secure.CONTENT_URI, null, null, null, null);
    if (cursor.moveToFirst()) {
        while (!cursor.isAfterLast()) {
            Log.d("MYAPP", "cursor: "
                    + cursor.getString(0) + ", "
                    + cursor.getString(1) + ", "
                    + cursor.getString(2));
            cursor.moveToNext();
        }
    }
    

    I compared results between enabling and disabling the setting, and sure enough I got:

    07-08 00:15:20.991: DEBUG/MYAPP(13813): cursor: 5154, preferred_network_mode, 1

    Do NOT use the index column (5154 in the example above), as I've noticed it changes between toggling the setting.

    Although this correlates with some documentation for Settings.Secure I found online, this value isn't respected by all phones.

    If your device returns -1, perhaps listing the key value pairs will reveal which setting you need. Please comment if you encounter it!

    0 讨论(0)
  • 2021-02-09 06:35

    As far as I can tell, there is no documented way of getting value for that setting. But there is a Use2GOnlyCheckBoxPreference class that can be used as an example. It uses internal Phone and PhoneFactory classes to obtain the current value of prefer_2g setting.

    You can use Phone and PhoneFactory classes via reflection. But of cause this is undocumented and is on your own risk. Here is relevant code from Use2GOnlyCheckBoxPreference:

    import com.android.internal.telephony.Phone;
    import com.android.internal.telephony.PhoneFactory;
    
    public class Use2GOnlyCheckBoxPreference extends CheckBoxPreference {
    
        private Phone mPhone;
        private MyHandler mHandler;
    
        public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            mPhone = PhoneFactory.getDefaultPhone();
            mHandler = new MyHandler();
            mPhone.getPreferredNetworkType(
                    mHandler.obtainMessage(MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
        }
    
        private class MyHandler extends Handler {
    
            private static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0;
    
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MESSAGE_GET_PREFERRED_NETWORK_TYPE:
                        handleGetPreferredNetworkTypeResponse(msg);
                        break;
                }
            }
    
            private void handleGetPreferredNetworkTypeResponse(Message msg) {
                AsyncResult ar = (AsyncResult) msg.obj;
    
                if (ar.exception == null) {
                    int type = ((int[])ar.result)[0];
                    Log.i(LOG_TAG, "get preferred network type="+type);
                    setChecked(type == Phone.NT_MODE_GSM_ONLY);
                } else {
                    // Weird state, disable the setting
                    Log.i(LOG_TAG, "get preferred network type, exception="+ar.exception);
                    setEnabled(false);
                }
            }
        }   
    }
    
    0 讨论(0)
提交回复
热议问题