android 3G 手机信号 信息获取

在androi中手机信号信息的获取可以通过系统提供的TELEPHONY_SERVICE获取

TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

TelephonyManager 可以监听 PhoneStateListener, PhoneStateListener 提供了

onSignalStrengthsChanged   手机信号变动
onServiceStateChanged      手机服务状态变动

其中onSignalStrengthsChanged可以获取到的有用信息如下:

/*
  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 误码率

  载干比 ,它是指空中模拟电波中的信号与噪声的比值
*/ 
奇怪的是移动的3G信号TD-SCDMA 信息没办法获取到

而onServiceStateChanged 提供的状态变动如下:

/*
  ServiceState.STATE_EMERGENCY_ONLY   仅限紧急呼叫
  ServiceState.STATE_IN_SERVICE       信号正常
  ServiceState.STATE_OUT_OF_SERVICE   不在服务区
  ServiceState.STATE_POWER_OFF        断电
*/


以下给出具体的实例:

1.在布局文件中增加一个3G图标,和显示具体信息的文本  (activity_g3_example.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:gravity="center"
    android:orientation="vertical">

    <ImageButton
        android:id="@+id/Icon_3GStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_3g"/>
    
    <TextView
        android:id="@+id/Label_3GDetail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxWidth="320dp"/>

</LinearLayout>

2. 为3G图标添加一组可选的图标,在drawable-hdpi目录下增加ic_3g.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="60"  android:drawable="@drawable/ic_3g_s3" />
    <item android:maxLevel="90"  android:drawable="@drawable/ic_3g_s2" />
    <item android:maxLevel="96"  android:drawable="@drawable/ic_3g_s1" />
    <item android:maxLevel="100" android:drawable="@drawable/ic_3g_s0" />
</level-list>

注意需要导入用到的图片


3.在代码中监听手机信号和状态的变动  (G3Example.java)

package com.example.g3example;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
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.widget.ImageButton;
import android.widget.TextView;

public class G3Example extends Activity {

    private final String TAG = "G3Example";

    private ImageButton       mIcon3G;
    private TextView          mLabel3G;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_g3_example);

        mIcon3G  = (ImageButton)findViewById(R.id.Icon_3GStatus);
        mLabel3G = (TextView)findViewById(R.id.Label_3GDetail); 

        TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        tel.listen(new PhoneStateMonitor(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS | PhoneStateListener.LISTEN_SERVICE_STATE);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_g3_example, menu);
        return true;
    }

    public class PhoneStateMonitor extends PhoneStateListener{
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            /*
            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 误码率

            载干比 ,它是指空中模拟电波中的信号与噪声的比值
             */ 
            mLabel3G.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());

            mIcon3G.setImageLevel(Math.abs(signalStrength.getGsmSignalStrength()));
        }

        public void onServiceStateChanged(ServiceState serviceState){
            super.onServiceStateChanged(serviceState);

            /*
             ServiceState.STATE_EMERGENCY_ONLY   仅限紧急呼叫
             ServiceState.STATE_IN_SERVICE       信号正常
             ServiceState.STATE_OUT_OF_SERVICE   不在服务区
             ServiceState.STATE_POWER_OFF        断电
             */
            switch(serviceState.getState())
            {
            case ServiceState.STATE_EMERGENCY_ONLY:
                Log.d(TAG, "3G STATUS : STATE_EMERGENCY_ONLY");
                break;
            case ServiceState.STATE_IN_SERVICE:
                Log.d(TAG, "3G STATUS : STATE_IN_SERVICE");
                break;
            case ServiceState.STATE_OUT_OF_SERVICE:
                Log.d(TAG, "3G STATUS : STATE_OUT_OF_SERVICE");
                break;
            case ServiceState.STATE_POWER_OFF:
                Log.d(TAG, "3G STATUS : STATE_POWER_OFF");
                break;
            default:
                break;
            }
        }
    }
}


4. 最后在AndroidManifest.xml增加获取手机信号权限的支持

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />




  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值