【Android】详解Android 网络操作
目录结构:
获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
1.判断网络
1.1 判断是否有网络连接
- public boolean isNetworkConnected(Context context) {
- if (context != null) {
- ConnectivityManager mConnectivityManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
- if (mNetworkInfo != null) {
- return mNetworkInfo.isAvailable();
- }
- }
- return false;
- }
1.2判断WIFI网络是否可用
- public boolean isWifiConnected(Context context) {
- if (context != null) {
- ConnectivityManager mConnectivityManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo mWiFiNetworkInfo = mConnectivityManager
- .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
- if (mWiFiNetworkInfo != null) {
- return mWiFiNetworkInfo.isAvailable();
- }
- }
- return false;
- }
这里需要注意,该方法只是判断当前环境下是否有可用的WIFI,并不是判断是否已经连接上WIFI。
1.3 判断MOBILE网络是否可用
- public boolean isMobileConnected(Context context) {
- if (context != null) {
- ConnectivityManager mConnectivityManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo mMobileNetworkInfo = mConnectivityManager
- .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
- if (mMobileNetworkInfo != null) {
- return mMobileNetworkInfo.isAvailable();
- }
- }
- return false;
- }
1.4 获取当前网络连接的类型信息
- public static int getConnectedType(Context context) {
- if (context != null) {
- ConnectivityManager mConnectivityManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
- if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
- return mNetworkInfo.getType();
- }
- }
- return -1;
- }
getType()的返回值可以是ConnectivityManager中的TYPE_MOBILE、TYPE_WIFI、TYPE_WIMAX、TYPE_ETHERNET、TYPE_BLUETOOTH、其他类型。
1.5 准确判断网络是否可用
有时候我们连接上一个没有外网连接的WiFi或者有线就会出现这种极端的情况,目前Android SDK还不能识别这种情况,一般的解决办法就是ping一个外网。
在使用下面这个方法之前应该加上如下的权限:
- <uses-permission android:name="android.permission.INTERNET" />
- /* @author suncat
- * @category 判断是否有外网连接(普通方法不能判断外网的网络是否连接,比如连接上局域网)
- * @return
- */
- public static final boolean ping() {
- String result = null;
- try {
- String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网
- Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping网址3次
- // 读取ping的内容,可以不加
- InputStream input = p.getInputStream();
- BufferedReader in = new BufferedReader(new InputStreamReader(input));
- StringBuffer stringBuffer = new StringBuffer();
- String content = "";
- while ((content = in.readLine()) != null) {
- stringBuffer.append(content);
- }
- Log.d("------ping-----", "result content : " + stringBuffer.toString());
- // ping的状态
- int status = p.waitFor();
- if (status == 0) {
- result = "success";
- return true;
- } else {
- result = "failed";
- }
- } catch (IOException e) {
- result = "IOException";
- } catch (InterruptedException e) {
- result = "InterruptedException";
- } finally {
- Log.d("----result---", "result = " + result);
- }
- return false;
- }
2.监听网络
定义广播接受者:
- BroadcastReceiver connectionReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- ConnectivityManager mConnectivityManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo mNetworkInfo = mConnectivityManager
- .getActiveNetworkInfo();
- int type = -1;
- if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
- type = mNetworkInfo.getType();
- }
- if (type == ConnectivityManager.TYPE_WIFI) {
- Toast.makeText(MainActivity.this, "wifi", Toast.LENGTH_SHORT)
- .show();
- } else if (type == ConnectivityManager.TYPE_MOBILE) {
- Toast.makeText(MainActivity.this, "网络可用", Toast.LENGTH_SHORT)
- .show();
- }else if(type==-1){
- Toast.makeText(MainActivity.this, "网络不可用", Toast.LENGTH_SHORT)
- .show();
- }else{
- Toast.makeText(MainActivity.this, "未知网络", Toast.LENGTH_SHORT)
- .show();
- }
- }
- };
在合适的位置注册:
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
- registerReceiver(connectionReceiver, intentFilter);
在合适的位置取消注册:
- unregisterReceiver(connectionReceiver);
【Android】详解Android 网络操作的更多相关文章
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- MTP in Android详解
MTP in Android详解 最近好长一段时间没有做笔记了,今天主要学习一下MTP相关的知识. MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套 ...
- (转载)实例详解Android快速开发工具类总结
实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- 详解Android Activity---启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- 图文详解 Android Binder跨进程通信机制 原理
图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...
- 详解Android Activity启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- 详解android:scaleType属性
详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262 http://juliaailse. ...
- adb shell 命令详解,android
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
随机推荐
- poj 1751 输出MST中新加入的边
给出结点的坐标 以及已建好的边 要输出MST中加入的边(已建好的边就不用输出了)结点的编号从1开始注意这题只有一组数据 不能用多组输入 否则就超时(在这被坑惨了Orz) Sample Input 91 ...
- 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 ...
- 利用sed把一行的文本文件改成每句一行
事实证明,至少在mac-osx上,利用sed插入一个换行符是很难的,常规的命令如: sed 's/[\.\?\!]/\n' file 是不可能的,会把那些标点符号变成n. 尝试了SO上的很多方法 ht ...
- k8s 使用
转自:https://blog.csdn.net/zyc88888/article/details/79281954
- P2700 逐个击破 最小生成树
题目描述 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这 ...
- 针对mysql delete删除表数据后占用空间不变小的问题
开发环境 Yii1版本 MySQL PHP5.6.27 前言 物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据 ...
- dict 知识汇总
增: 1. copy 浅复制 2. setdefault (有就查询,没有就添加): 删: 3. clear:清除 4. pop :删除指定键值对 5. popitem : 随机删除一组键值对 改: ...
- react-router v4 路由规则解析
前言 react-router升级到4之后,跟前面版本比有了很大的差别. 例如包的拆分,动态路由等详细的差别就不说了,各位大神的总结也很到位,详细可以点击看看,All About React Rout ...
- Spring Boot 入门详细分析
推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...
- python单元测试模块unittest
1.unittest_demo.py # coding=utf-8 import time import unittest from HtmlTestRunner import HTMLTestRun ...