获取安卓手机网络类型及强度,电量等信息

获取网络类型及网络强度
ps:这里只需要区分移动数据和wifi即可,具体需要区分运营商请自行补全。

Java层获取相关信息
        由于网络相关信息是底层信息,故此调用的底层接口。
        移动数据状态可以用TelephonyManager监听LISTEN_SIGNAL_STRENGTHS的方式进行获取,在发生变化时会自动通知。
        wifi采用WifiManager监听WIFI_SERVICE的方式进行。在发生变化时会自动通知。
        ps:这里网络强度分为移动网络和wifi

声明相关变量:

    //网络状态强度
    public static final int NETLEVEL_STRENGTH_NONE_OR_UNKNOWN = 0;
    public static final int NETLEVEL_STRENGTH_POOR = 1;
    public static final int NETLEVEL_STRENGTH_MODERATE = 2;
    public static final int NETLEVEL_STRENGTH_GOOD = 3;
    public static final int NETLEVEL_STRENGTH_GREAT = 4;

    //信号监听
    TelephonyManager        Tel;  
    MyPhoneStateListener    MyListener; 
    public static int singnalLevel;

    //Wifi监听
    private static WifiInfo wifiInfo = null;
    private static WifiManager wifiManager = null; 
    public static int wifiLevel;

​


在onCreate等方法中添加监听:

    //添加信号强度监听
    MyListener = new MyPhoneStateListener();
    Tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

    //添加wifi强度监听
    wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);

    @Override
     protected void onPause() {
        super.onPause();
        Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
    }


获取信息代码:
        ps:这里向C++传值的时候用到了数组,定义了返回值会数组的java方法:public static int[] getNetInfo(){…}

    //--------------------------------------网络类型及强度  begin------------------------------------------
    //定义数组用于返回
    static int[] netInfo = new int[2];

    //netType   -1: 没有网络    1: WIFI     2: 移动数据
    //netLevel  1: None 2:poor  3:moderate  4:good  5:great 
    public static int[] getNetInfo() {
        Log.d("getNetInfo", "enter the function getNetInfo ----- ");
        //根据Android的安全机制,在使用ConnectivityManager时,必须在AndroidManifest.xml中添加<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 否则无法获得系统的许可。
        ConnectivityManager connMgr = (ConnectivityManager)appactivity.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if( null == networkInfo)
            return netInfo;
        int nType = networkInfo.getType();
        if (nType == ConnectivityManager.TYPE_MOBILE) {
            netInfo[0] = 2;
        }
        else if (nType == ConnectivityManager.TYPE_WIFI) {
            netInfo[0] = 1;
        }
        Log.d("getNetInfo", "java ---- netType --- "+ netInfo[0]);

        //according to netType. set the value of netLevel
        switch (netInfo[0]) {
        case 1:
            netInfo[1] = getWifiLevel();
            break;
        case 2:
            netInfo[1] = getSingnalLevel();
            break;
        default:
            break;
        }
        Log.d("getNetInfo", "java ---- netLevel --- "+ netInfo[1]);

        return netInfo;
    }
    //信号强度等级
    private class MyPhoneStateListener extends PhoneStateListener  
    {  
      @Override  
      public void onSignalStrengthsChanged(SignalStrength signalStrength)  
      {  
         super.onSignalStrengthsChanged(signalStrength);  
         int asu = signalStrength.getGsmSignalStrength();
         if (asu <= 2 || asu == 99) singnalLevel = NETLEVEL_STRENGTH_NONE_OR_UNKNOWN;
         else if (asu >= 12) singnalLevel = NETLEVEL_STRENGTH_GREAT;
         else if (asu >= 8)  singnalLevel = NETLEVEL_STRENGTH_GOOD;
         else if (asu >= 5)  singnalLevel = NETLEVEL_STRENGTH_MODERATE;
         else singnalLevel = NETLEVEL_STRENGTH_POOR;
      }  
    };/* End of private Class */  
    //获取信号强度
    public static int getSingnalLevel() {
         return singnalLevel;
    }

    //获取wifi强度
    public static int getWifiLevel() {
        wifiInfo = wifiManager.getConnectionInfo();
        int wifiStrength = wifiInfo.getRssi();
        if (wifiStrength <= 0 && wifiStrength >= -50) {  
            wifiLevel = NETLEVEL_STRENGTH_GREAT;
        } else if (wifiStrength < -50 && wifiStrength >= -70) {  
            wifiLevel = NETLEVEL_STRENGTH_GOOD; 
        } else if (wifiStrength < -70 && wifiStrength >= -80) {  
            wifiLevel = NETLEVEL_STRENGTH_MODERATE;
        } else if (wifiStrength < -80 && wifiStrength >= -100) {  
            wifiLevel = NETLEVEL_STRENGTH_POOR; 
        } else {  
            wifiLevel = NETLEVEL_STRENGTH_NONE_OR_UNKNOWN; 
        } 
        return wifiLevel;
    }
//--------------------------------------网络类型及强度  end------------------------------------------  


C++端接收返回的网络类型和状态

void getNetInfo(int &netType, int &netLevel)
    {

#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
        JniMethodInfo t;
        bool isHave = JniHelper::getStaticMethodInfo(t, JAVA_CLASSNAME, "getNetInfo", "()[I");
        if (isHave)
        {
            jintArray msg = (jintArray)t.env->CallStaticObjectMethod(t.classID, t.methodID);
            int len = t.env->GetArrayLength(msg);
            jint* elems =t.env-> GetIntArrayElements(msg, 0); 
            if (2 == len)
            {
                netType = elems[0];
                netLevel = elems[1];
            }
            log(" netType :%d----------netLevel: %d ----------- %d", netType, netLevel, len);

            t.env->DeleteLocalRef(t.classID);
        }
        else
        {
            cocos2d::log("JniFun call getNetInfo error!");
        }
#endif
    }


获取电量相关信息
android层面可以利用BroadcastReceiver机制,获取电池电量变化的ACTION_BATTERY_CHANGED intent,进而获取当前android设备的电池状态。(这里只获取了电量。)
步骤:
1. 创建一个监听ACTION_BATTERY_CHANGED事件的intentFilter。
2. 创建一个BroadcastReceiver对象,该对象可以接收broadcast intent。
3. 注册BroadcastReceiver对象来监听ACTION_BATTERY_CHANGED事件。
4. 在BroadcastReceiver对象中,重写onReceive方法,在onReceive方法的传入参数intent里获取需要的电池状态信息。
5. 在生命周期结束时,取消step4中的注册。

声明相关变量

    //电量数值
    BatteryBroadcastReceiver receiver = new BatteryBroadcastReceiver();
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    public static int batteryLevel = 0;



添加及注销监听

onCreate方法

    //添加电量信息监听
    registerReceiver(receiver, filter);


    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }


具体获取方法

    //--------------------------------------电量信息  begin------------------------------------------
    class BatteryBroadcastReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            //判断它是否是为电量变化的Broadcast Action
            if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){
                //获取当前电量
                int level = intent.getIntExtra("level", 0);
                //电量的总刻度
                int scale = intent.getIntExtra("scale", 100);
                //把它转成百分比
                batteryLevel =  level * 100 / scale;
            }
        }

    }

    //获取电量信息
    public static int getBatteryLevel() {
        return batteryLevel;
    }

  //--------------------------------------电量信息  end------------------------------------------

值得一看:https://blog.csdn.net/xiaoyifeishuang1/article/details/103276182

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值