package com.example.telephonymanager;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class PhoneStateSampleActivity extends Activity {
private static final String APP_NAME = "SignalLevelSample";
private static final int EXCELLENT_LEVEL = 75;
private static final int GOOD_LEVEL = 50;
private static final int MODERATE_LEVEL = 25;
private static final int WEAK_LEVEL = 0;
private static final int INFO_SERVICE_STATE_INDEX = 0;
private static final int INFO_CELL_LOCATION_INDEX = 1;
private static final int INFO_CALL_STATE_INDEX = 2;
private static final int INFO_CONNECTION_STATE_INDEX = 3;
private static final int INFO_SIGNAL_LEVEL_INDEX = 4;
private static final int INFO_SIGNAL_LEVEL_INFO_INDEX = 5;
private static final int INFO_DATA_DIRECTION_INDEX = 6;
private static final int INFO_DEVICE_INFO_INDEX = 7;
private static final int[] info_ids = { R.id.serviceState_info,
R.id.cellLocation_info, R.id.callState_info,
R.id.connectionState_info, R.id.signalLevel, R.id.signalLevelInfo,
R.id.dataDirection, R.id.device_info };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startSignalLevelListener();
displayTelephonyInfo();
}
@Override
protected void onPause() {
super.onPause();
stopListening();
}
@Override
protected void onResume() {
super.onResume();
startSignalLevelListener();
}
@Override
protected void onDestroy() {
stopListening();
super.onDestroy();
}
private void setTextViewText(int id, String text) {
((TextView) findViewById(id)).setText(text);
}
private void setSignalLevel(int id, int infoid, int level) {
int progress = (int) ((((float) level) / 31.0) * 100);
String signalLevelString = getSignalLevelString(progress);
((ProgressBar) findViewById(id)).setProgress(progress);
((TextView) findViewById(infoid)).setText(signalLevelString);
Log.i("signalLevel ", "" + progress);
}
private String getSignalLevelString(int level) {
String signalLevelString = "Weak";
if (level > EXCELLENT_LEVEL)
signalLevelString = "Excellent";
else if (level > GOOD_LEVEL)
signalLevelString = "Good";
else if (level > MODERATE_LEVEL)
signalLevelString = "Moderate";
else if (level > WEAK_LEVEL)
signalLevelString = "Weak";
return signalLevelString;
}
private void stopListening() {
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}
private void setDataDirection(int id, int direction) {
int resid = getDataDirectionRes(direction);
((ImageView) findViewById(id)).setImageResource(resid);
}
private int getDataDirectionRes(int direction) {
int resid = R.drawable.data_none;
switch (direction) {
case TelephonyManager.DATA_ACTIVITY_IN:
resid = R.drawable.data_in;
break;
case TelephonyManager.DATA_ACTIVITY_OUT:
resid = R.drawable.data_out;
break;
case TelephonyManager.DATA_ACTIVITY_INOUT:
resid = R.drawable.data_both;
break;
case TelephonyManager.DATA_ACTIVITY_NONE:
resid = R.drawable.data_none;
break;
default:
resid = R.drawable.data_none;
break;
}
return resid;
}
private void startSignalLevelListener() {
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
int events = PhoneStateListener.LISTEN_SIGNAL_STRENGTH
| PhoneStateListener.LISTEN_DATA_ACTIVITY
| PhoneStateListener.LISTEN_CELL_LOCATION
| PhoneStateListener.LISTEN_CALL_STATE
| PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
| PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
| PhoneStateListener.LISTEN_SERVICE_STATE;
tm.listen(phoneStateListener, events);
}
private void displayTelephonyInfo() {
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
GsmCellLocation loc = (GsmCellLocation) tm.getCellLocation();
// Reorganize it to do one getSomeData, logString it in pairs, with code guards
if (loc == null) {
return;
}
int cellid = loc.getCid();
int lac = loc.getLac();
String deviceid = tm.getDeviceId();
String phonenumber = tm.getLine1Number();
String softwareversion = tm.getDeviceSoftwareVersion();
String operatorname = tm.getNetworkOperatorName();
String simcountrycode = tm.getSimCountryIso();
String simoperator = tm.getSimOperatorName();
String simserialno = tm.getSimSerialNumber();
String subscriberid = tm.getSubscriberId();
String networktype = getNetworkTypeString(tm.getNetworkType());
String phonetype = getPhoneTypeString(tm.getPhoneType());
logString("CellID: " + cellid);
logString("LAC: " + lac);
logString("Device ID: " + deviceid);
logString("Phone Number: " + phonenumber);
logString("Software Version: " + softwareversion);
logString("Operator Name: " + operatorname);
logString("SIM Country Code: " + simcountrycode);
logString("SIM Operator: " + simoperator);
logString("SIM Serial No.: " + simserialno);
logString("Sibscriber ID: " + subscriberid);
String deviceinfo = "";
deviceinfo += ("CellID: " + cellid + "\n");
deviceinfo += ("LAC: " + lac + "\n");
deviceinfo += ("Device ID: " + deviceid + "\n");
deviceinfo += ("Phone Number: " + phonenumber + "\n");
deviceinfo += ("Software Version: " + softwareversion + "\n");
deviceinfo += ("Operator Name: " + operatorname + "\n");
deviceinfo += ("SIM Country Code: " + simcountrycode + "\n");
deviceinfo += ("SIM Operator: " + simoperator + "\n");
deviceinfo += ("SIM Serial No.: " + simserialno + "\n");
deviceinfo += ("Subscriber ID: " + subscriberid + "\n");
deviceinfo += ("Network Type: " + networktype + "\n");
deviceinfo += ("Phone Type: " + phonetype + "\n");
List<NeighboringCellInfo> cellinfo = tm.getNeighboringCellInfo();
if (null != cellinfo) {
for (NeighboringCellInfo info : cellinfo) {
deviceinfo += ("\tCellID: " + info.getCid() + ", RSSI: "
+ info.getRssi() + "\n");
}
}
setTextViewText(info_ids[INFO_DEVICE_INFO_INDEX], deviceinfo);
}
private String getNetworkTypeString(int type) {
String typeString = "Unknown";
switch (type) {
case TelephonyManager.NETWORK_TYPE_EDGE:
typeString = "EDGE";
break;
case TelephonyManager.NETWORK_TYPE_GPRS:
typeString = "GPRS";
break;
case TelephonyManager.NETWORK_TYPE_UMTS:
typeString = "UMTS";
break;
default:
typeString = "UNKNOWN";
break;
}
return typeString;
}
private String getPhoneTypeString(int type) {
String typeString = "Unknown";
switch (type) {
case TelephonyManager.PHONE_TYPE_GSM:
typeString = "GSM";
break;
case TelephonyManager.PHONE_TYPE_NONE:
typeString = "UNKNOWN";
break;
default:
typeString = "UNKNOWN";
break;
}
return typeString;
}
private int logString(String message) {
return Log.i(APP_NAME, message);
}
private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallForwardingIndicatorChanged(boolean cfi) {
Log.i(APP_NAME, "onCallForwardingIndicatorChanged " + cfi);
super.onCallForwardingIndicatorChanged(cfi);
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
String callState = "UNKNOWN";
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
callState = "IDLE";
break;
case TelephonyManager.CALL_STATE_RINGING:
callState = "Ringing (" + incomingNumber + ")";
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callState = "Offhook";
break;
}
setTextViewText(info_ids[INFO_CALL_STATE_INDEX], callState);
Log.i(APP_NAME, "onCallStateChanged " + callState);
super.onCallStateChanged(state, incomingNumber);
}
@Override
public void onCellLocationChanged(CellLocation location) {
String locationString = location.toString();
setTextViewText(info_ids[INFO_CELL_LOCATION_INDEX], locationString);
Log.i(APP_NAME, "onCellLocationChanged " + locationString);
super.onCellLocationChanged(location);
}
@Override
public void onDataActivity(int direction) {
String directionString = "none";
switch (direction) {
case TelephonyManager.DATA_ACTIVITY_IN:
directionString = "IN";
break;
case TelephonyManager.DATA_ACTIVITY_OUT:
directionString = "OUT";
break;
case TelephonyManager.DATA_ACTIVITY_INOUT:
directionString = "INOUT";
break;
case TelephonyManager.DATA_ACTIVITY_NONE:
directionString = "NONE";
break;
default:
directionString = "UNKNOWN: " + direction;
break;
}
setDataDirection(info_ids[INFO_DATA_DIRECTION_INDEX], direction);
Log.i(APP_NAME, "onDataActivity " + directionString);
super.onDataActivity(direction);
}
@Override
public void onDataConnectionStateChanged(int state) {
String connectionState = "Unknown";
switch (state) {
case TelephonyManager.DATA_CONNECTED:
connectionState = "Connected";
break;
case TelephonyManager.DATA_CONNECTING:
connectionState = "Connecting";
break;
case TelephonyManager.DATA_DISCONNECTED:
connectionState = "Disconnected";
break;
case TelephonyManager.DATA_SUSPENDED:
connectionState = "Suspended";
break;
default:
connectionState = "Unknown: " + state;
break;
}
setTextViewText(info_ids[INFO_CONNECTION_STATE_INDEX],
connectionState);
Log.i(APP_NAME, "onDataConnectionStateChanged " + connectionState);
super.onDataConnectionStateChanged(state);
}
@Override
public void onMessageWaitingIndicatorChanged(boolean mwi) {
Log.i(APP_NAME, "onMessageWaitingIndicatorChanged " + mwi);
super.onMessageWaitingIndicatorChanged(mwi);
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
String serviceStateString = "UNKNOWN";
switch (serviceState.getState()) {
case ServiceState.STATE_IN_SERVICE:
serviceStateString = "IN SERVICE";
break;
case ServiceState.STATE_EMERGENCY_ONLY:
serviceStateString = "EMERGENCY ONLY";
break;
case ServiceState.STATE_OUT_OF_SERVICE:
serviceStateString = "OUT OF SERVICE";
break;
case ServiceState.STATE_POWER_OFF:
serviceStateString = "POWER OFF";
break;
default:
serviceStateString = "UNKNOWN";
break;
}
setTextViewText(info_ids[INFO_SERVICE_STATE_INDEX],
serviceStateString);
Log.i(APP_NAME, "onServiceStateChanged " + serviceStateString);
super.onServiceStateChanged(serviceState);
}
@Override
public void onSignalStrengthChanged(int asu) {
Log.i(APP_NAME, "onSignalStrengthChanged " + asu);
setSignalLevel(info_ids[INFO_SIGNAL_LEVEL_INDEX],
info_ids[INFO_SIGNAL_LEVEL_INFO_INDEX], asu);
super.onSignalStrengthChanged(asu);
}
};
}