目录结构:

contents structure [+]

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。

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

1.判断网络

1.1 判断是否有网络连接

  1. public boolean isNetworkConnected(Context context) {
  2. if (context != null) {
  3. ConnectivityManager mConnectivityManager = (ConnectivityManager) context
  4. .getSystemService(Context.CONNECTIVITY_SERVICE);
  5. NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
  6. if (mNetworkInfo != null) {
  7. return mNetworkInfo.isAvailable();
  8. }
  9. }
  10. return false;
  11. }

1.2判断WIFI网络是否可用

  1. public boolean isWifiConnected(Context context) {
  2. if (context != null) {
  3. ConnectivityManager mConnectivityManager = (ConnectivityManager) context
  4. .getSystemService(Context.CONNECTIVITY_SERVICE);
  5. NetworkInfo mWiFiNetworkInfo = mConnectivityManager
  6. .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  7. if (mWiFiNetworkInfo != null) {
  8. return mWiFiNetworkInfo.isAvailable();
  9. }
  10. }
  11. return false;
  12. }

这里需要注意,该方法只是判断当前环境下是否有可用的WIFI,并不是判断是否已经连接上WIFI。

1.3 判断MOBILE网络是否可用

  1. public boolean isMobileConnected(Context context) {
  2. if (context != null) {
  3. ConnectivityManager mConnectivityManager = (ConnectivityManager) context
  4. .getSystemService(Context.CONNECTIVITY_SERVICE);
  5. NetworkInfo mMobileNetworkInfo = mConnectivityManager
  6. .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  7. if (mMobileNetworkInfo != null) {
  8. return mMobileNetworkInfo.isAvailable();
  9. }
  10. }
  11. return false;
  12. }

1.4 获取当前网络连接的类型信息

  1. public static int getConnectedType(Context context) {
  2. if (context != null) {
  3. ConnectivityManager mConnectivityManager = (ConnectivityManager) context
  4. .getSystemService(Context.CONNECTIVITY_SERVICE);
  5. NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
  6. if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
  7. return mNetworkInfo.getType();
  8. }
  9. }
  10. return -1;
  11. }

getType()的返回值可以是ConnectivityManager中的TYPE_MOBILE、TYPE_WIFI、TYPE_WIMAX、TYPE_ETHERNET、TYPE_BLUETOOTH、其他类型。

1.5 准确判断网络是否可用

有时候我们连接上一个没有外网连接的WiFi或者有线就会出现这种极端的情况,目前Android SDK还不能识别这种情况,一般的解决办法就是ping一个外网。

在使用下面这个方法之前应该加上如下的权限:

  1. <uses-permission android:name="android.permission.INTERNET" />
  1. /* @author suncat
  2. * @category 判断是否有外网连接(普通方法不能判断外网的网络是否连接,比如连接上局域网)
  3. * @return
  4. */
  5. public static final boolean ping() {
  6.  
  7. String result = null;
  8. try {
  9. String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网
  10. Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping网址3次
  11. // 读取ping的内容,可以不加
  12. InputStream input = p.getInputStream();
  13. BufferedReader in = new BufferedReader(new InputStreamReader(input));
  14. StringBuffer stringBuffer = new StringBuffer();
  15. String content = "";
  16. while ((content = in.readLine()) != null) {
  17. stringBuffer.append(content);
  18. }
  19. Log.d("------ping-----", "result content : " + stringBuffer.toString());
  20. // ping的状态
  21. int status = p.waitFor();
  22. if (status == 0) {
  23. result = "success";
  24. return true;
  25. } else {
  26. result = "failed";
  27. }
  28. } catch (IOException e) {
  29. result = "IOException";
  30. } catch (InterruptedException e) {
  31. result = "InterruptedException";
  32. } finally {
  33. Log.d("----result---", "result = " + result);
  34. }
  35. return false;
  36. }

2.监听网络

定义广播接受者:

  1. BroadcastReceiver connectionReceiver = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. ConnectivityManager mConnectivityManager = (ConnectivityManager) context
  5. .getSystemService(Context.CONNECTIVITY_SERVICE);
  6. NetworkInfo mNetworkInfo = mConnectivityManager
  7. .getActiveNetworkInfo();
  8. int type = -1;
  9. if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
  10. type = mNetworkInfo.getType();
  11. }
  12. if (type == ConnectivityManager.TYPE_WIFI) {
  13. Toast.makeText(MainActivity.this, "wifi", Toast.LENGTH_SHORT)
  14. .show();
  15. } else if (type == ConnectivityManager.TYPE_MOBILE) {
  16. Toast.makeText(MainActivity.this, "网络可用", Toast.LENGTH_SHORT)
  17. .show();
  18. }else if(type==-1){
  19. Toast.makeText(MainActivity.this, "网络不可用", Toast.LENGTH_SHORT)
  20. .show();
  21. }else{
  22. Toast.makeText(MainActivity.this, "未知网络", Toast.LENGTH_SHORT)
  23. .show();
  24. }
  25. }
  26. };

在合适的位置注册:

  1. IntentFilter intentFilter = new IntentFilter();
  2. intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  3. registerReceiver(connectionReceiver, intentFilter);

在合适的位置取消注册:

  1. unregisterReceiver(connectionReceiver);

【Android】详解Android 网络操作的更多相关文章

  1. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  2. MTP in Android详解

    MTP in Android详解 最近好长一段时间没有做笔记了,今天主要学习一下MTP相关的知识. MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套 ...

  3. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  4. 详解Android首选项框架ListPreference

    详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...

  5. 详解Android Activity---启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

  6. Android Binder IPC详解-Android学习之旅(96)

    linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...

  7. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...

  8. 详解Android Activity启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

  9. 详解android:scaleType属性

    详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262    http://juliaailse. ...

  10. adb shell 命令详解,android

    http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...

随机推荐

  1. poj 1751 输出MST中新加入的边

    给出结点的坐标 以及已建好的边 要输出MST中加入的边(已建好的边就不用输出了)结点的编号从1开始注意这题只有一组数据 不能用多组输入 否则就超时(在这被坑惨了Orz) Sample Input 91 ...

  2. hdu 1879 有的边已存在 (MST)

    Sample Input31 2 1 0 //u v w 是否已建 1 3 2 02 3 4 031 2 1 01 3 2 02 3 4 131 2 1 01 3 2 12 3 4 10 Sample ...

  3. 利用sed把一行的文本文件改成每句一行

    事实证明,至少在mac-osx上,利用sed插入一个换行符是很难的,常规的命令如: sed 's/[\.\?\!]/\n' file 是不可能的,会把那些标点符号变成n. 尝试了SO上的很多方法 ht ...

  4. k8s 使用

    转自:https://blog.csdn.net/zyc88888/article/details/79281954

  5. P2700 逐个击破 最小生成树

    题目描述 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这 ...

  6. 针对mysql delete删除表数据后占用空间不变小的问题

    开发环境 Yii1版本 MySQL PHP5.6.27 前言 物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据 ...

  7. dict 知识汇总

    增: 1. copy 浅复制 2. setdefault (有就查询,没有就添加): 删: 3. clear:清除 4. pop :删除指定键值对 5. popitem :  随机删除一组键值对 改: ...

  8. react-router v4 路由规则解析

    前言 react-router升级到4之后,跟前面版本比有了很大的差别. 例如包的拆分,动态路由等详细的差别就不说了,各位大神的总结也很到位,详细可以点击看看,All About React Rout ...

  9. Spring Boot 入门详细分析

    推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...

  10. python单元测试模块unittest

    1.unittest_demo.py # coding=utf-8 import time import unittest from HtmlTestRunner import HTMLTestRun ...