前两天遇到一个比较古老的项目(Android 2.2版本),各种错误,各种难用,公司负责对项目进行维护和优化,就组织QC(测试)部门对它进行了全面测试,发现了一堆问题,我就负责搞定这些问题,囧!看着凌乱的代码,各种问题,感觉看哪里都不正常了。其中有一个功能:程序登陆的时候检测手机是否联网,假如联网直接进入登陆界面,假如没有联网,则当用户点击提示的确定按钮时,打开手机网络连接设置界面“。但是这个程序,点击确定就会强制退出,通过研究发现原来问题在这里:
转载:
由于Android的SDK版本不同所以里面的API和设置方式也是有少量变化的,尤其是在Android 3.0 及后面的版本,UI和显示方式也发生了变化,其中网络设置的调用发生了彻底改变,所以假如还停留在之前的调用方式,那么程序就会出错,因此应该在调用之前加一个判断,假如:手机的API<10,则一种调用方式,API>10则是另一种调用方式,
调用方式:
//判断手机系统的版本 即API大于10 就是3.0或以上版本 if(android.os.Build.VERSION.SDK_INT>10){ intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); }else{ intent = new Intent(); ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings"); intent.setComponent(component); intent.setAction("android.intent.action.VIEW"); } context.startActivity(intent);
在 AndroidManifest.xml中设置权限
因此,程序强退就是因为开发的时候还是2.2版本,到3.0之后就会出错!!
转载:
获取网络连接状态
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能。
Android平台提供了 类,用于网络连接状态的检测。
Android开发文档这样描述 的作用:
Class that answers queries about the state of network connectivity. It also notifies applications when network connectivity changes. Get an instance of this class by calling.
The primary responsibilities of this class are to:
- Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)
- Send broadcast intents when network connectivity changes
- Attempt to "fail over" to another network when connectivity to a network is lost
- Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks
privatevoid checkNetworkInfo() { ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); //mobile 3G Data Network State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); txt3G.setText(mobile.toString()); //wifi State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); txtWifi.setText(wifi.toString()); //如果3G网络和wifi网络都未连接,且不是处于正在连接状态 则进入Network Setting界面 由用户配置网络连接 if(mobile==State.CONNECTED||mobile==State.CONNECTING) return; if(wifi==State.CONNECTED||wifi==State.CONNECTING) return; startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));//进入无线网络配置界面 //startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //进入手机中的wifi网络设置界面 }
注:
根据Android的安全机制,在使用ConnectivityManager时,必须在AndroidManifest.xml中添加<uses- permission android:name="android.permission.ACCESS_NETWORK_STATE" />
否则无法获得系统的许可。
wi-fi 状态为已连接(CONNECTED).