Android Data Analyse(3)--APN & ApnSetting & ApnContext

13150 단어 Data-학습
APN
정의: APN(access point name)은 간단하게 데이터가 인터넷에 접속하는 접속점 이름으로 이해할 수 있으며, 데이터에 접근하기 위해 반드시 설정해야 하는 매개 변수이다.이 파라미터의 설정은 데이터에 접근하는 접근 방식을 직접 결정한다.
매개변수:
  "     (China Mobile) WAP"
      mcc="460"
      mnc="00"
      apn="cmwap"
      proxy="10.0.0.172"
      port="80"
      type="default,supl"
  />

이름:
설명
carrier
이 APN의 이름(휴대폰에서 볼 수 있음)
mccmnc
핸드폰 mccmnc
apn
접속점
proxy
대리점
port
포트
type
이 apn이 인터넷에 접속할 수 있는 유형
구성:
apn은 구글에서 모든 운영자에게 사용할 수 있는 기본 설정을 정의했습니다. 기본 저장 위치는 device/sample/etc/apns-full-conf.xml에 있습니다.컴파일 후 시스템/etc/apns-conf.xml로 복사됩니다.서로 다른 운영자의 수요에 맞추어 apns-full-conf.xml에서 변경할 수 있습니다.휴대전화에서 apn은telephony에 존재한다.db 중입니다.구체적인 위치는 다음과 같습니다.content://telephony/carriers
로드: device에서 simcard load가 감지된 후 일련의 호출을 거쳤습니다.
    protected void onRecordsLoadedOrSubIdChanged() {
    ...
        createAllApnList();//              apn
        setInitialAttachApn();//    accach apn
     ...
    }
    /**
     * Based on the sim operator numeric, create a list for all possible
     * Data Connections and setup the preferredApn.
     */
    protected void createAllApnList() {
        mMvnoMatched = false;//        ,     
        mAllApnSettings = new ArrayList();
        IccRecords r = mIccRecords.get();
        String operator = mPhone.getOperatorNumeric();
        if (operator != null) {
            String selection = "numeric = '" + operator + "'";
            String orderBy = "_id";
            // query only enabled apn.
            // carrier_enabled : 1 means enabled apn, 0 disabled apn.
            // selection += " and carrier_enabled = 1";
            if (DBG) log("createAllApnList: selection=" + selection);

            //  mccmnc   apn  
            Cursor cursor = mPhone.getContext().getContentResolver().query(
                    Telephony.Carriers.CONTENT_URI, null, selection, null, orderBy);

            if (cursor != null) {
                if (cursor.getCount() > 0) {
                //       apn
                    mAllApnSettings = createApnList(cursor);
                }
                cursor.close();
            }
        }

        //  Emergency APN settings
        addEmergencyApnSetting();

        //     apn
        dedupeApnSettings();

        if (mAllApnSettings.isEmpty()) {
            if (DBG) log("createAllApnList: No APN found for carrier: " + operator);
            mPreferredApn = null;
            // TODO: What is the right behavior?
            //notifyNoData(DataConnection.FailCause.MISSING_UNKNOWN_APN);
        } else {
            mPreferredApn = getPreferredApn();
            if (mPreferredApn != null && !mPreferredApn.numeric.equals(operator)) {
                mPreferredApn = null;
                setPreferredApn(-1);
            }
            if (DBG) log("createAllApnList: mPreferredApn=" + mPreferredApn);
        }
        if (DBG) log("createAllApnList: X mAllApnSettings=" + mAllApnSettings);

        setDataProfilesAsNeeded();
    }

ApnSetting
ApnSetting은 간단하게 APN의 구조 함수(?)로 볼 수 있습니다.데이터베이스를 조회할 때 주로 ApnSetting 형식으로 저장됩니다.그 매개 변수는 각각telephony에 대응한다.db carrier 표의 각 항목.구조 함수:

    public ApnSetting(int id, String numeric, String carrier, String apn,
            String proxy, String port,
            String mmsc, String mmsProxy, String mmsPort,
            String user, String password, int authType, String[] types,
            String protocol, String roamingProtocol, boolean carrierEnabled, int bearer,
            int bearerBitmask, int profileId, boolean modemCognitive, int maxConns, int waitTime,
            int maxConnsTime, int mtu, String mvnoType, String mvnoMatchData) {
        this.id = id; //       ID
        this.numeric = numeric; // mccmnc
        this.carrier = carrier; // apn   (  settings   )
        this.apn = apn; //   
        this.proxy = proxy; //apn    
        this.port = port; //apn     
        this.mmsc = mmsc; //      
        this.mmsProxy = mmsProxy; //    
        this.mmsPort = mmsPort; //    
        this.user = user; //   (to be update)
        this.password = password; //   (to be update)
        this.authType = authType; //   (to be update)
        this.types = new String[types.length]; // apn   data  
        for (int i = 0; i < types.length; i++) {
            this.types[i] = types[i].toLowerCase(Locale.ROOT);
        }
        this.protocol = protocol;
        this.roamingProtocol = roamingProtocol;
        this.carrierEnabled = carrierEnabled;
        this.bearer = bearer;//         (?)
        this.bearerBitmask = (bearerBitmask | ServiceState.getBitmaskForTech(bearer));
        this.profileId = profileId;
        this.modemCognitive = modemCognitive;
        this.maxConns = maxConns;
        this.waitTime = waitTime;
        this.maxConnsTime = maxConnsTime;
        this.mtu = mtu;
        this.mvnoType = mvnoType;
        this.mvnoMatchData = mvnoMatchData;

    }

핵심 커넥터:

    /**
     *        type      。
     *                ,        
     */
    public boolean canHandleType(String type) {
        if (!carrierEnabled) return false;
        for (String t : types) {
            // DEFAULT handles all, and HIPRI is handled by DEFAULT
            if (t.equalsIgnoreCase(type) ||
                    t.equalsIgnoreCase(PhoneConstants.APN_TYPE_ALL) ||
                    (t.equalsIgnoreCase(PhoneConstants.APN_TYPE_DEFAULT) &&
                    type.equalsIgnoreCase(PhoneConstants.APN_TYPE_HIPRI))) {
                return true;
            }
        }
        return false;
    }

ApnContext
APN & ApnSetting은 모두 설정 매개 변수이고, ApnContext는 APN or ApnSetting을 조작합니다.Dctracker나 DataConnection 등 데이터와 관련된 주요 관련 클래스에서 주로 ApnContext를 조작하여 APN 관련 정보를 읽거나 설정합니다.
공통 인터페이스:
이음매
반환값
설명
getApnSetting
ApnSetting
현재 APN으로 돌아가기
getApnType
String
현재 APN 유형으로 돌아가기
getState
DctConstants.State
이 apn의 대응하는 네트워크 상태를 되돌려줍니다
isConnectedOrConnecting
boolean
현재 apn에 대응하는 네트워크의 연결 여부를 되돌려줍니다



시스템 호출:

    /**
     *        type         
     */
    public boolean isDataPossible(String apnType) {
        ApnContext apnContext = mApnContexts.get(apnType);
        if (apnContext == null) {
            return false;
        }
        boolean apnContextIsEnabled = apnContext.isEnabled();
        DctConstants.State apnContextState = apnContext.getState();
        boolean apnTypePossible = !(apnContextIsEnabled &&
                (apnContextState == DctConstants.State.FAILED));
        boolean isEmergencyApn = apnContext.getApnType().equals(PhoneConstants.APN_TYPE_EMERGENCY);
        // Set the emergency APN availability status as TRUE irrespective of conditions checked in
        // isDataAllowed() like IN_SERVICE, MOBILE DATA status etc.
        boolean dataAllowed = isEmergencyApn || isDataAllowed(null);
        boolean possible = dataAllowed && apnTypePossible;

        if ((apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT)
                    || apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IA))
                && (mPhone.getServiceState().getRilDataRadioTechnology()
                == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) {
            log("Default data call activation not possible in iwlan.");
            possible = false;
        }

        if (VDBG) {
            log(String.format("isDataPossible(%s): possible=%b isDataAllowed=%b " +
                            "apnTypePossible=%b apnContextisEnabled=%b apnContextState()=%s",
                    apnType, possible, dataAllowed, apnTypePossible,
                    apnContextIsEnabled, apnContextState));
        }
        return possible;
    }

좋은 웹페이지 즐겨찾기