主にandroidとかのメモ

無線関連APIのWCDMAとCDMA2000両対応

どんどん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