Android Data Analyse(3)--APN & ApnSetting & ApnContext
13150 단어 Data-학습
정의: 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;
}