您的位置:首页 > 移动开发 > Android开发

【android L数据连接】如何在Sim Cards的cellular data添加OFF

2015-12-07 15:20 453 查看
如何在sim cards的preferences sim中添加一个OFF项,来实现和SystemUi中下拉中的data connection相同的功能(关闭当前卡的数据连接)?

在SimDialogActivity.java中修改:

1、setDefaultDataSubId(content,subid)方法中

final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);

//modify by dino for Bug #168346 begin

//miscExt.setDefaultDataEnable(context, subId);

//simExt.setDataState(subId);

//subscriptionManager.setDefaultDataSubId(subId);

//simExt.setDataStateEnable(subId);

获取得到telephonyManager对象

TelephonyManager telephonyManager = TelephonyManager.from(context);

获取当前卡的数据连接的布尔值(如果选中卡1或者卡2为true否则false)

boolean enableBefore = telephonyManager.getDataEnabled();

获取默认数据连接卡号

int preSubId = subscriptionManager.getDefaultDataSubId();

Log.d(TAG, "setDefaultDataSubId flag: " + enableBefore + ", subId: "+ subId + ", preSubId: " + preSubId);

Log.d(TAG, "setDefaultDataSubId subscriptionManager.isValidSubscriptionId(subId) : " + subscriptionManager.isValidSubscriptionId(subId));

判断卡数是否为正数(isValidSubscriptionId如果卡的数量大于-1返回true)

if (subscriptionManager.isValidSubscriptionId(subId)) {

设置默认的(选中的)数据连接

subscriptionManager.setDefaultDataSubId(subId);

判断当前卡数是否唯一相等(一张卡两个值必定相等,两张卡需判断当前默认和preSubId是否相等)

if (subId != preSubId){

if (enableBefore) {

设置当前卡开启数据连接

telephonyManager.setDataEnabled(subId, true);

设置切换前的卡的数据关闭连接

telephonyManager.setDataEnabled(preSubId, false);

}

} else {

若subid==preSubId直接设置开启数据连接

telephonyManager.setDataEnabled(subId, true);

}

}

2、添加一个方法setDataConnectionOff(context,subId)和1很类似不同就在if条件位置。

private static void setDataConnectionOff(final Context context, final int subId) {

ISettingsMiscExt miscExt = UtilsExt.getMiscPlugin(context);

ISimManagementExt simExt = UtilsExt.getSimManagmentExtPlugin(context);

if (TelecomManager.from(context).isInCall()) {

String textErr =

context.getResources().getString(R.string.default_data_switch_err_msg1);

textErr = miscExt.customizeSimDisplayString(textErr, subId);

Toast.makeText(context, textErr, Toast.LENGTH_SHORT).show();

return;

}

final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);

TelephonyManager telephonyManager = TelephonyManager.from(context);

boolean enableBefore = telephonyManager.getDataEnabled();

//int preSubId = subscriptionManager.getDefaultDataSubId();

Log.d(TAG, "setDataConnectionOff flag: " + enableBefore + ", subId: "+ subId);

if (subscriptionManager.isValidSubscriptionId(subId)) {

subscriptionManager.setDefaultDataSubId(subId);

因为这是一个单独的dialog而不是卡,所以不许要判断subId和preSubId,直接关闭当前卡的网络就好

if (enableBefore) {

telephonyManager.setDataEnabled(subId, false);

}

}

3、在CreateDialog()中

在点击cellular data选择使用那张卡作为数据连接,当点击OFF时获取为空。所以需要添加判空条件,并关闭数据连接。

public void onClick(DialogInterface dialog, int value) {

final SubscriptionInfo sir;

switch (id) {

case DATA_PICK:

sir = subInfoList.get(value);

if (null == sir){

setDataConnectionOff(context, subscriptionManager.getDefaultDataSubId());

} else if (!mExt.switchDefaultDataSub(context, sir.getSubscriptionId())) {

setDefaultDataSubId(context, sir.getSubscriptionId());

}

break;

case CALLS_PICK:

4、CreateDialog.java

在点击Cellular data是弹出dialog中添加一条OFF点击item

ArrayList<SubscriptionInfo> callsSubInfoList = new ArrayList<SubscriptionInfo>();

ArrayList<SubscriptionInfo> smsSubInfoList = new ArrayList<SubscriptionInfo>();

if (id == CALLS_PICK) {

final TelecomManager telecomManager = TelecomManager.from(context);

final Iterator<PhoneAccountHandle> phoneAccounts =

telecomManager.getCallCapablePhoneAccounts().listIterator();

if (telecomManager.getCallCapablePhoneAccounts().size() > 1) {

list.add(getResources().getString(R.string.sim_calls_ask_first_prefs_title));

callsSubInfoList.add(null);

}

while (phoneAccounts.hasNext()) {

final PhoneAccount phoneAccount =

telecomManager.getPhoneAccount(phoneAccounts.next());

list.add((String)phoneAccount.getLabel());

if (phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) &&

TextUtils.isDigitsOnly(phoneAccount.getAccountHandle().getId())) {

final String phoneAccountId = phoneAccount.getAccountHandle().getId();

final SubscriptionInfo sir = Utils.findRecordBySubId(context,

Integer.parseInt(phoneAccountId));

callsSubInfoList.add(sir);

} else {

callsSubInfoList.add(null);

}

}

mExt.customizeListArray(list);

mExt.customizeSubscriptionInfoArray(callsSubInfoList);

} else if (id == SMS_PICK) {

initSmsData(list, subInfoList, selectableSubInfoLength, smsSubInfoList);

} else {

for (int i = 0; i < selectableSubInfoLength; ++i) {

final SubscriptionInfo sir = subInfoList.get(i);

CharSequence displayName = sir.getDisplayName();

if (displayName == null) {

displayName = "";

}

list.add(displayName.toString());

}

if (selectableSubInfoLength > 0) {

list.add(“OFF”);

subInfoList.add(null);

}

}

5、在CreateDialog()中的getView()中添加红色的

作用是不显示图片

if (mDialogId == SMS_PICK &&

position > SubscriptionManager.from(mContext)

.getActiveSubscriptionInfoCount()) {

Drawable drawable = mExt.getSmsAutoItemIcon(mContext);

holder.icon.setImageDrawable(drawable);

Log.d(TAG, "mDialogId: " + mDialogId + ", position: " + position);

} else if (mDialogId == CALLS_PICK) {

setAccountBitmap(holder, position);

} else if(mDialogId ==DATA_PICK){

holder.icon.setImageDrawable(null);

}
else {

holder.icon.setImageDrawable(getResources()

.getDrawable(R.drawable.ic_live_help));

}

在SimSettings.java中的修改

1、添加相关的包

import android.database.ContentObserver;

import android.os.Handler;

import android.provider.Settings;

import android.content.ContentResolver;

2、创建对象

private DataDefaultSimObserver mDataDefaultSimObserver;

protected ContentResolver mResolver;

3、在updateCellularDataValues()中

private void updateCellularDataValues() {

final Preference simPref = findPreference(KEY_CELLULAR_DATA);

TelephonyManager mTelephonyManager = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);

boolean enableBefore = mTelephonyManager.getDataEnabled();

if (simPref != null) {

SubscriptionInfo sir = Utils.findRecordBySubId(getActivity(),

mSubscriptionManager.getDefaultDataSubId());

simPref.setTitle(R.string.cellular_data_title);

if (DBG) log("[updateCellularDataValues] mSubInfoList=" + mSubInfoList);

sir = mExt.setDefaultSubId(getActivity(), sir, 2);

if (sir != null) {

if (enableBefore) {

simPref.setSummary(sir.getDisplayName());

} else {

simPref.setSummary(R.string.sim_data_connection_off_title);

}

} else if (sir == null) {

simPref.setSummary(R.string.sim_selection_required_pref);

}

simPref.setEnabled(mSelectableSubInfos.size() >= 1 &&

(!mIsAirplaneModeOn) &&

(!isCapabilitySwitching()));

}

}

4、在onResume()中添加

if (mDataDefaultSimObserver != null) {

mDataDefaultSimObserver.unregister();

}

mDataDefaultSimObserver = new DataDefaultSimObserver(new Handler(), getActivity());

mDataDefaultSimObserver.register();

5、在onPause()中添加

if (mDataDefaultSimObserver != null) {

mDataDefaultSimObserver.unregister();

}

6、添加方法DataDefaultSimObserver内部类

private class DataDefaultSimObserver extends ContentObserver{

public DataDefaultSimObserver(Handler handler, Context context){

super(handler);

mResolver = context.getContentResolver();

}

public void register() {

String contentUri;

if (TelephonyManager.getDefault().getSimCount() == 1) {

contentUri = Settings.Global.MOBILE_DATA;

}else {

contentUri = Settings.Global.MOBILE_DATA + SubscriptionManager.getDefaultDataSubId();

}

mResolver.registerContentObserver(Settings.Global.getUriFor(contentUri), false, this);

Log.d("DINO","DataDefaultSimObserver register()");

}

public void unregister() {

mResolver.unregisterContentObserver(this);

}

@Override

public void onChange(boolean selfChange){

Log.d("DINO", "mDataDefaultSimObserver dataEnabld ");

updateCellularDataValues();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: