APN管理

手机放入sim卡后可以对apn进行管理,主要是数据库的操作。由于当时要做的是一个IPC的方案,所以为了解决aidl对参数类的限制,需要自定义如下的aidl类型:

package com.xxx.service;

import android.os.Parcel;
import android.os.Parcelable;

public class ApnInfo implements Parcelable {
    private String apnName;
    private String apn;
    private String userName;
    private String password;
    private String proxy;
    private String port;
    
    public ApnInfo(){
        
    }
    
    public ApnInfo(Parcel parcel){
        readFromParcel(parcel);
    }
    
    
    public String getApnName() {
        return apnName;
    }

    public void setApnName(String apnName) {
        this.apnName = apnName;
    }

    public String getApn() {
        return apn;
    }

    public void setApn(String apn) {
        this.apn = apn;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getProxy() {
        return proxy;
    }

    public void setProxy(String proxy) {
        this.proxy = proxy;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    @Override
    public String toString() {
        return "ApnInfo [apnName=" + apnName + ", apn=" + apn + ", userName="
                + userName + ", password=" + password + ", proxy=" + proxy
                + ", port=" + port + "]";
    }

    private void readFromParcel(Parcel parcel) {
        // TODO Auto-generated method stub
        this.apnName=parcel.readString();
        this.apn=parcel.readString();
        this.userName=parcel.readString();
        this.password=parcel.readString();
        this.proxy=parcel.readString();
        this.port=parcel.readString();
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeString(this.apnName);
        dest.writeString(this.apn);
        dest.writeString(this.userName);
        dest.writeString(this.password);
        dest.writeString(this.proxy);
        dest.writeString(this.port);
    }
    public static final Parcelable.Creator<ApnInfo> CREATOR = new Creator<ApnInfo>() {

        @Override
        public ApnInfo[] newArray(int size) {
            // TODO Auto-generated method stub
            return new ApnInfo[size];
        }

        @Override
        public ApnInfo createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
            return new ApnInfo(source);
        }
    };
}

然后定义一个同名的aidl类,将其声明为可在aidl中进行传递的类:

package com.xxx.service;
parcelable ApnInfo;

之后,我们就可以直接在aidl中传递这个自定义类型ApnInfo,最后就是相应service的实现:

    private static final Uri APN_URI = Uri.parse("content://telephony/carriers");      
    private static final Uri PREFERAPN_URI = Uri.parse("content://telephony/carriers/preferapn");

   private Uri getUriForCurrSubId(Uri uri) {
        SubscriptionInfo mSubscriptionInfo = SubscriptionManager.from(mContext).getActiveSubscriptionInfo(SubscriptionManager.getDefaultDataSubscriptionId());
        int subId = mSubscriptionInfo != null ? mSubscriptionInfo.getSubscriptionId()
                : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
        if (SubscriptionManager.isValidSubscriptionId(subId)) {
            return Uri.withAppendedPath(uri, "subId/" + String.valueOf(subId));
        } else {
            return uri;
        }
    }
    private String getSelectedApnKey() {
        String key = null;
        Cursor cursor = mContext.getContentResolver().query(getUriForCurrSubId(PREFERAPN_URI),
                new String[] {"_id"}, null, null, null);
        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            key = cursor.getString(0);
        }
        cursor.close();
        return key;
    }   
    //添加APN信息
    public boolean addApn(ApnInfo apnInfo){
        // TODO Auto-generated method stub
        Log.d(TAG,"start addApn");
        TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        String numeric=tm.getSubscriberId().substring(0, 5);
        ContentValues values = new ContentValues();
        values.put("name", apnInfo.getApnName());
        values.put("apn", apnInfo.getApn());
        values.put("type","default");
        values.put("numeric",numeric);
        values.put("mcc", numeric.substring(0, 3));
        values.put("mnc", numeric.substring(3, 5));
        values.put("proxy", apnInfo.getProxy());
        values.put("port", apnInfo.getPort());
        values.put("mmsproxy","");
        values.put("mmsport","");
        values.put("user",apnInfo.getUserName());
        values.put("server","");
        values.put("password",apnInfo.getPassword());
        values.put("mmsc","");      
        Uri newUri = mContext.getContentResolver().insert(APN_URI, values);
        if (newUri != null){
            Log.d(TAG, "addApn: " + newUri);
            return true;
        }
        Log.d(TAG, "addApn failed");
        return false;   
    }
    //删除APN信息
    public boolean deleteApn(String apnName){
        // TODO Auto-generated method stub
        Log.d(TAG,"start deleteApn");
        int count=mContext.getContentResolver().delete(APN_URI,"name=?",new String[]{apnName});
        return count>0;
    }   
    //获得当前的APN信息
    public ApnInfo getCurrApn(){
        Log.d(TAG,"start getCurrApn");
        ApnInfo apnInfo=new ApnInfo();
        int pos = Integer.parseInt(getSelectedApnKey());
        Uri PreferApnUri = ContentUris.withAppendedId(APN_URI, pos);
        Cursor cr = mContext.getContentResolver().query(PreferApnUri, null, null, null, null);
        Log.d(TAG, "getCurrentApn : cr=" + cr);
        while(cr!=null && cr.moveToNext()){
            apnInfo.setApnName(cr.getString(cr.getColumnIndex("name")));
            apnInfo.setApn(cr.getString(cr.getColumnIndex("apn")));
            apnInfo.setUserName(cr.getString(cr.getColumnIndex("user")));
            apnInfo.setPassword(cr.getString(cr.getColumnIndex("password")));
            apnInfo.setProxy(cr.getString(cr.getColumnIndex("proxy")));
            apnInfo.setPort(cr.getString(cr.getColumnIndex("port")));
        }
        if(cr!=null){
            cr.close();
        }
        return apnInfo;     
    }
    //设置当前的APN
    public boolean setCurrApn(String apnName){  
        Log.d(TAG,"start setCurrApn");  
        int count=-1;
        ContentResolver resolver = mContext.getContentResolver();   
        Cursor cursor= mContext.getContentResolver().query(APN_URI,new String[] {"_id"},"name=?",new String[]{apnName},null);
        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            ContentValues values = new ContentValues();
            values.put("apn_id", cursor.getInt(0));
            count=resolver.update(getUriForCurrSubId(PREFERAPN_URI), values, null, null);
        }
        if (cursor != null) {
            cursor.close();
        }
        return count>0;     
    }
    //查询所有已有的APN信息
    public List<ApnInfo> getAllApn(){   
        Log.d(TAG,"start getAllApn");
        List<ApnInfo> list = new ArrayList();
        CarrierConfigManager configManager = (CarrierConfigManager)
                mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        PersistableBundle b = configManager.getConfig();
        boolean mHideImsApn = b.getBoolean(CarrierConfigManager.KEY_HIDE_IMS_APN_BOOL);     
        final TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        final String mccmnc = tm.getSubscriberId().substring(0, 5);
        Log.d(TAG, "mccmnc = " + mccmnc);
        StringBuilder where = new StringBuilder("numeric=\"" + mccmnc +
                "\" AND NOT (type='ia' AND (apn=\"\" OR apn IS NULL)) AND user_visible!=0");

        if (mHideImsApn) {
            where.append(" AND NOT (type='ims')");
        }

        Cursor cr = mContext.getContentResolver().query(APN_URI, null, where.toString(), null, null);  
        while (cr != null && cr.moveToNext()) { 
            ApnInfo apnInfo=new ApnInfo();
            apnInfo.setApnName(cr.getString(cr.getColumnIndex("name")));
            apnInfo.setApn(cr.getString(cr.getColumnIndex("apn")));
            apnInfo.setUserName(cr.getString(cr.getColumnIndex("user")));
            apnInfo.setPassword(cr.getString(cr.getColumnIndex("password")));
            apnInfo.setProxy(cr.getString(cr.getColumnIndex("proxy")));
            apnInfo.setPort(cr.getString(cr.getColumnIndex("port")));       
            Log.d(TAG, "apnInfo=" + apnInfo);  
            list.add(apnInfo);
        }
        if(cr!=null){
            cr.close();
        }
        Log.d(TAG, "getApnList---list" + list);  
        return list;        
    }

没有什么可讲的,就是数据库的相关操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容