对于手机开发者来说,网络的使用就尤为重要了,在使用网络之前就得做网络的判断,判断当前手机使用的网络是无线网络还是移动网络,告知用户,以免造成一些不必要的麻烦.

1.对网络连接的判断

要对网络进行判断,首先要获取手机系统权限,再运用安卓sdk中的NetworkInfo去获得当前网络,从而获得当前网络连接类型,由于程序在运行中可能会遇到的多种断开网络的情况,所以,在这里就要注册一个广播实时监听网络的链接状态.这个网络监听的作用就是只要程序发生的网络连接的变化,网络监听都可以捕捉到(包括连接wifi,连接移动网络,断开wifi,断开移动网络),由此可见网络监听的重要性

下面来看一段代码:

/**
  * 网络监听
  * @author WYH
  *
  */
 public class ConnectionChangeRecevier extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {
         //获取系统权限
         ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         if (connectivity != null) {
             @SuppressWarnings("deprecation")
             //通过权限获取当前网络状态
             NetworkInfo[] info = connectivity.getAllNetworkInfo();
             if (info != null) { //info!= null表示当前有网络连接
                 for (int i = 0; i < info.length; i++) {
                     if (info[i].getState() == NetworkInfo.State.CONNECTED) { //表示网络连接成功
                         switch (info[i].getType()) { //对连接网络的类型判断
                         case ConnectivityManager.TYPE_WIFI://如果当前连接的是wifi
                             ToastXutil.show("当前是wifi连接"+"--"+info[i].getTypeName());
                             break;
                         case ConnectivityManager.TYPE_MOBILE://如果当前连接的是移动网络
                             ToastXutil.show("当前是移动网络连接"+"--"+info[i].getTypeName());
                             break;
                         default://默认连接其他未知网络
                             ToastXutil.show("未知网络连接");    
                             break;
                         }
                     } 
                 }
             }
         }
         if (!MainActivity.isNetworkAvailable(context)) {//如果当前没有网络连接
             ToastXutil.show("网断了!");
         }
     }

 }

 对于编写这个网络监听的广播,上面的注释已经写得很清楚了,考虑到这个广播作为实时监听网络情况,所以在清单文件中使用静态注册的方法: <!-- 断网监听 -->
         <receiver
             android:name="com.example.wifitest.ConnectionChangeRecevier"
             android:label="NetworkConnection" >
             <intent-filter>
                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
             </intent-filter>
         </receiver>另外再附上几个判断网络的算法:
// 检测网络连接
         /** 检查是否有网络 */
         public static boolean isNetworkAvailable(Context context) {
             NetworkInfo info = getNetworkInfo(context);
             if (info != null) {
                 return info.isAvailable();
             }
             return false;
         }

         /** 检查是否是WIFI */
         public static boolean isWifi(Context context) {
             NetworkInfo info = getNetworkInfo(context);
             if (info != null) {
                 if (info.getType() == ConnectivityManager.TYPE_WIFI)
                     return true;
             }
             return false;
         }

         /** 检查是否是移动网络 */
         public static boolean isMobile(Context context) {
             NetworkInfo info = getNetworkInfo(context);
             if (info != null) {
                 if (info.getType() == ConnectivityManager.TYPE_MOBILE)
                     return true;
             }
             return false;
         }
         private static NetworkInfo getNetworkInfo(Context context) {

             ConnectivityManager cm = (ConnectivityManager) context
                     .getSystemService(Context.CONNECTIVITY_SERVICE);
             return cm.getActiveNetworkInfo();
         }

最后看下真机运行测试的效果:测试顺序(wifi,移动网络打开----关闭wifi----关闭移动网络----打开移动网络----打开wifi)

java 安卓定位界面开关_ide

首先启动程序

java 安卓定位界面开关_算法_02

当前wifi和移动网络是正常的

java 安卓定位界面开关_移动网络_03

当把wifi关了的瞬间,网络监听广播监听到网络发生变化而且当前网络断开了,就会弹出网断了!提示

java 安卓定位界面开关_移动网络_04

在wifi关闭之后程序检测到移动网络还是可用的,接着就会连上移动网络,当连接成功后,网络监听判断到网络连接正常的同时,获取连接网络的类型是否wifi还是移动网络,弹出连接移动网的数据.

java 安卓定位界面开关_手机系统_05

当把wifi和移动网络同时关闭,这是网络监听知道当前程序没用网络连接,所以弹出一个网断了的提示.

java 安卓定位界面开关_ide_06

把移动网络打开,网络监听重新获取到连接的网络并获取连接的网络类型,再弹出提示

java 安卓定位界面开关_手机系统_07

打开移动网络的同时再把wifi打开,这是由于wifi的优先级别比移动网络的高,所以此时的网络又会发生变化,只要发生网络变化,网络监听就会捕捉,自然而然会提示是当前是wifi连接.

总结:基于安卓无线和移动网络的API和一些算法,手机程序可判断当前网络连接类型,从而进行一些功能操作,或者强制性基于无线网络下的操作,因为程序已自动识别网络连接状态.

2.基于安卓GPS定位与算法

由于程序某些功能需求,对于实时位置的坐标信息也是必不可少的,如果嫌集成高德地图百度地图麻烦,不妨试一下安卓自带的GPS定位功能

要使用GPS,首先要判断手机是否打开GPS,因为很多用户不习惯长时间打开GPS,如果GPS没打开,定位信息自然获取不了,所以,先写一个判断的方法:

private boolean checkGPS(){
    //判断GPS是否正常启动
    boolean isOn = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isOn){//如果打开则不操作
        return true;
    }else {//如果没有打开则手动打开GPS
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent,0);
        return false;
    }
}
(这时,也可以对GPS进行监听,防止在定位的过程中被关闭而造成定位的失败)
/**
 * GPS状态变化时触发
 */
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}
/**
 * GPS开启时触发
 */
@Override
public void onProviderEnabled(String provider) {

}
/**
 * GPS禁用时触发
 */
@Override
public void onProviderDisabled(String provider) {

}
这三个方法是重写LocationListener接口的方法
这

获取位置信息的方法:

/**
 * 获取位置信息
 * @return
 */
private Location getLocation()
{
    //获取位置管理服务
    locationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
    //查找服务信息
    Criteria criteria = new Criteria();    criteria.setAccuracy(Criteria.ACCURACY_FINE); //定位精度: 最高    criteria.setAltitudeRequired(false); //海拔信息:不需要    criteria.setBearingRequired(false); //方位信息: 不需要    criteria.setCostAllowed(false);  //是否允许付费    criteria.setPowerRequirement(Criteria.POWER_LOW); //耗电量: 低功耗    String provider = locationManager.getBestProvider(criteria, true); //获取GPS信息    Location location = null;    try{        location = locationManager.getLastKnownLocation(provider);        locationManager.requestLocationUpdates(provider, 2000, 5, this);    }catch (Exception e){        ToastXutil.show("手机缺少用户权限");    }    return location;}
接着就是接收位置信息:
/**
 * 位置信息变化时触发
 */
@Override
public void onLocationChanged(Location location) {
    if(location != null) {
        lat = location.getLatitude();
        lng = location.getLongitude();
        ToastXutil.show("纬度:"+lat+",经度:"+lng);
    }else {
       //获取位置信息失败
    }}
这方法同样来源于LocationListener接口
注意:所获取的坐标(lat,lng)是谷歌地图坐标,与百度,高德,腾讯地图坐标有实际差距
附上转换高德地图的坐标方法:
/**
 * 根据类型 转换 坐标
 */
public static LatLng convert(LatLng sourceLatLng, Context context) {
    CoordinateConverter converter  = new CoordinateConverter(context);
    // CoordType.GPS 待转换坐标类型
    converter.from(CoordinateConverter.CoordType.valueOf("GPS"));
    // sourceLatLng待转换坐标点
    converter.coord(sourceLatLng);
    // 执行转换操作
    LatLng desLatLng = converter.convert();
    return desLatLng;
}
最后看下真机运行的截图:
无线情况下和移动网络情况下都没有问题.
附加内容:

说明:基于高德定位API的无线定位和移动网络定位

这就是我自己摸索的一点技术,我希望可以跟更多的人去分享,在编写博客过程中有任何不足的地方,希望多多指教,下次我会做得更好的,谢谢!