package yifeiyuan.practice.practicedemos.info; import android.content.Context; import android.net.TrafficStats; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.telephony.CellInfo; import android.telephony.CellLocation; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import java.util.List; import butterknife.InjectView; import yifeiyuan.practice.practicedemos.R; import yifeiyuan.practice.practicedemos.base.ToolbarActivity; /** * * 信号强度 参考 : * http://blog.csdn.net/zmwell/article/details/6826700 * https://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma * http://yuemeiqing2008-163-com.iteye.com/blog/2077489 */ public class DeviceInfoActivty extends ToolbarActivity { @InjectView(R.id.tv_device_info) TextView mTvDeviceInfo; @InjectView(R.id.tv_signal_info) TextView mTvSignalInfo; private long mTotalRxBytes = TrafficStats.getTotalRxBytes(); private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { //不准?... long mrx = TrafficStats.getMobileRxBytes() / 1024; ////获取通过Mobile连接收到的字节总数,不包含WiFi long mtx = TrafficStats.getMobileTxBytes() / 1024; //Mobile发送的总字节数 long trx = (long) ((TrafficStats.getTotalRxBytes() - mTotalRxBytes) * 1.00f / 1024); mTotalRxBytes = TrafficStats.getTotalRxBytes(); //获取总的接受字节数,包含Mobile和WiFi等 long ttx = TrafficStats.getTotalTxBytes() / 1024; //总的发送字节数,包含Mobile和WiFi等 long uidrx = TrafficStats.getUidRxBytes(getApplicationInfo().uid) / 1024;//获取某个网络UID的接受字节数,某一个进程的总接收量 long uidtx = TrafficStats.getUidTxBytes(getApplicationInfo().uid) / 1024;//获取某个网络UID的发送字节数,某一个进程的总发送量 StringBuilder sb = new StringBuilder(); sb.append("mrx:" + mrx + "\n\r") .append("mtx:" + mtx + "\n\r") .append("trx:" + trx + "\n\r") .append("ttx:" + ttx + "\n\r") .append("uidrx:" + uidrx + "\n\r") .append("uidtx:" + uidtx + "\n\r") ; mTvDeviceInfo.setText(sb.toString()); mHandler.sendEmptyMessageDelayed(0, 1000); return true; } }); private TelephonyManager mTelephonyManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_device_info_activty); mHandler.sendEmptyMessageDelayed(0, 0); mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //LISTEN_SIGNAL_STRENGTHS Listen for changes to the network signal strengths (cellular). mTelephonyManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS | PhoneStateListener.LISTEN_SERVICE_STATE); } private class MyPhoneStateListener extends PhoneStateListener { public MyPhoneStateListener() { super(); } /** * ServiceState.STATE_EMERGENCY_ONLY 仅限紧急呼叫 * ServiceState.STATE_IN_SERVICE 信号正常 * ServiceState.STATE_OUT_OF_SERVICE 不在服务区 * ServiceState.STATE_POWER_OFF 断电 */ @Override public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); Log.d(TAG, "onServiceStateChanged() called with " + "serviceState = [" + serviceState + "]"); } @Override public void onSignalStrengthChanged(int asu) { super.onSignalStrengthChanged(asu); Log.d(TAG, "onSignalStrengthChanged() called with " + "asu = [" + asu + "]"); } @Override public void onMessageWaitingIndicatorChanged(boolean mwi) { super.onMessageWaitingIndicatorChanged(mwi); Log.d(TAG, "onMessageWaitingIndicatorChanged() called with " + "mwi = [" + mwi + "]"); } @Override public void onCallForwardingIndicatorChanged(boolean cfi) { super.onCallForwardingIndicatorChanged(cfi); Log.d(TAG, "onCallForwardingIndicatorChanged() called with " + "cfi = [" + cfi + "]"); } @Override public void onCellLocationChanged(CellLocation location) { super.onCellLocationChanged(location); Log.d(TAG, "onCellLocationChanged() called with " + "location = [" + location + "]"); } @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); Log.d(TAG, "onCallStateChanged() called with " + "state = [" + state + "], incomingNumber = [" + incomingNumber + "]"); } @Override public void onDataConnectionStateChanged(int state) { super.onDataConnectionStateChanged(state); Log.d(TAG, "onDataConnectionStateChanged() called with " + "state = [" + state + "]"); } @Override public void onDataConnectionStateChanged(int state, int networkType) { super.onDataConnectionStateChanged(state, networkType); Log.d(TAG, "onDataConnectionStateChanged() called with " + "state = [" + state + "], networkType = [" + networkType + "]"); } @Override public void onDataActivity(int direction) { super.onDataActivity(direction); Log.d(TAG, "onDataActivity() called with " + "direction = [" + direction + "]"); } /** * signalStrength.isGsm() 是否GSM信号 2G or 3G * signalStrength.getCdmaDbm(); 联通3G 信号强度 * signalStrength.getCdmaEcio(); 联通3G 载干比 * signalStrength.getEvdoDbm(); 电信3G 信号强度 * signalStrength.getEvdoEcio(); 电信3G 载干比 * signalStrength.getEvdoSnr(); 电信3G 信噪比 * signalStrength.getGsmSignalStrength(); 2G 信号强度 * signalStrength.getGsmBitErrorRate(); 2G 误码率 * 载干比 ,它是指空中模拟电波中的信号与噪声的比值 */ @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); Log.d(TAG, "onSignalStrengthsChanged() called with " + "signalStrength :"+signalStrength+";\n gsmSignalStrength = [" + signalStrength.getGsmSignalStrength() + "]"); // if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) { // mTvSignalInfo.setText("GSM Strength" + signalStrength.getGsmSignalStrength()); // } else if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) { // mTvSignalInfo.setText("CDMA Strength" + signalStrength.getCdmaDbm() + " dBm"); // } else { // mTvSignalInfo.setText("Unknown PhoneType: " + mTelephonyManager.getPhoneType()); // } mTvSignalInfo.setText("IsGsm : " + signalStrength.isGsm() + "\nCDMA Dbm : " + signalStrength.getCdmaDbm() + " Dbm" + "\nCDMA Ecio : " + signalStrength.getCdmaEcio() + " dB*10" + "\nEvdo Dbm : " + signalStrength.getEvdoDbm() + " Dbm" + "\nEvdo Ecio : " + signalStrength.getEvdoEcio() + " dB*10" + "\nGsm SignalStrength : " + signalStrength.getGsmSignalStrength() + "\nGsm BitErrorRate : " + signalStrength.getGsmBitErrorRate()); } @Override public void onCellInfoChanged(List<CellInfo> cellInfo) { super.onCellInfoChanged(cellInfo); Log.d(TAG, "onCellInfoChanged() called with " + "cellInfo = [" + cellInfo + "]"); } } @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacksAndMessages(null); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_device_info_activty, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }