どんどんandroidのバージョンが上がって2.1辺りでCDMA2000対応された。
日本でもauからandroid端末が出て、もう避けて通れなくなったので、無線方式に依存するTelephony系を実験した結果を記録。
TelephonyManagerとSignalStrengthは、通信方式によらず呼び出し可能。
通信方式に依存するパラメータは、無効な値が入るだけ。
onCellLocationChangedは通信方式によって、CellLocationにgsmCellLocationかcdmaCellLocationが設定される。
メソッドも違うので、GSM/WCDMAなのにgetBaseStationId()したり、CDMAなのにgetLac()したりすると例外が発生する。
android2.0まではGSM前提で書いていた処理を、通信方式CDMA対応させる必要が出てくる。
試行錯誤の結果、下記でGSM/WCDMAとCDMA2000両対応完了。
docomoのXperiaとauのIS03で動作確認できた。
//基地局の変化時に呼ばれる @Override public void onCellLocationChanged(CellLocation location) { strCellLocation="\n--- android.telephony.CellLocation:\n"; if(location instanceof GsmCellLocation){ strCellLocation+="***GsmCellLocation\n"; GsmCellLocation loc=(GsmCellLocation)location; strCellLocation+="getCid()="+loc.getCid()+"\n"; strCellLocation+="getLac()="+loc.getLac()+"\n"; }else if(location instanceof CdmaCellLocation){ strCellLocation+="***CdmaCellLocation\n"; CdmaCellLocation loc=(CdmaCellLocation)location; strCellLocation+="getBaseStationId()="+loc.getBaseStationId()+"\n"; strCellLocation+="getBaseStationLatitude()="+loc.getBaseStationLatitude()+"\n"; strCellLocation+="getBaseStationLongitude()="+loc.getBaseStationLongitude()+"\n"; strCellLocation+="getNetworkId()="+loc.getNetworkId()+"\n"; strCellLocation+="getSystemId()="+loc.getSystemId()+"\n"; } }
IS03の結果
— android.telephony.CellLocation:
***CdmaCellLocation
getBaseStationId()=1202
getBaseStationLatitude()=507216
getBaseStationLongitude()=2011139
getNetworkId()=21560
getSystemId()=12305