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

    如何在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();  
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值