方法一
在 Telephony 中增加一个服务允许配置(以android4.4为例)
主要是通过 setPreferredNetworkModeForPhone 方法配置
添加静态服务
packages/services/Telephony/src/com/android/phone/NetTypeReceiver.java
public class NetTypeReceiver extends BroadcastReceiver {
private static final String LOG_TAG = NetTypeReceiver.class.getSimpleName();
public static final String ACTION_UPDATE_CALLER_INFO_CACHE =
"com.android.phone.CHANGE_NETWORK_MODE";
private int mPhoneId = 0;
private Phone mPhone;
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
int modemNetworkMode = 0;
Log.d(LOG_TAG, "NetTypeReceiver#onReceive(). Intent: " + intent);
// mPhoneId = getIntent().getIntExtra(NetTypeReceiver.SUB_ID, 0);
Log.d(LOG_TAG, "mPhoneId:" + mPhoneId);
mPhone = (PhoneFactory.getPhones())[mPhoneId];
if (mPhone != null) {
if (bundle != null) {
modemNetworkMode = bundle.getInt("com.android.phone.NETWORK_MODE");
}
Log.d(LOG_TAG, "NetTypeReceiver#onReceive(). mPhone ceate success");
int primaryCard = TelephonyManager.from(mPhone.getContext()).getPrimaryCard();
Log.d(LOG_TAG, "NetTypeReceiver#onReceive(). primaryCard:" + primaryCard);
if (modemNetworkMode != -1 && SimManager.isValidPhoneId(primaryCard)) {
RadioTaskManager.getDefault().setPreferredNetworkModeForPhone(primaryCard,
modemNetworkMode);
}
}
}
}
在 xml 中配置
<receiver android:name="NetTypeReceiver">
<intent-filter>
<action android:name="com.android.phone.CHANGE_NETWORK_MODE" />
</intent-filter>
</receiver>
在app中通过设置属性和广播配置
private static final int PREFERRED_NETWORK_MODE_4G_3G_2G = 0;
private static final int PREFERRED_NETWORK_MODE_3G_2G = 1;
private static final int PREFERRED_NETWORK_MODE_2G_ONLY = 4;
public void setPreferedNetWorkType(Context context, int mode){
Settings.Secure.putInt(context.getContentResolver(), "preferred_network_mode", mode);
Intent intent = new Intent("com.android.phone.CHANGE_NETWORK_MODE");
intent.putExtra("com.android.phone.NETWORK_MODE", mode);
context.sendBroadcast(intent);
}