`

Android在代码中打开Wifi、移动网络和GPS

阅读更多
以下方法前2个在2.3.5和4.1.1中测试成功,第3个方法在2.3.5中测试没问题,但在4.1.1中无效,待解决。详见android.provider.Settings.Secure类。
 
记得在AndroidManifest.xml中声明相关权限:
[html] view plaincopy
 
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>      
  2. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>      
  3. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>      
  4. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  
1. 打开WiFi最简单,直接调用系统的方法即可:
[java] view plaincopy
 
  1. /** 
  2.      * WIFI网络开关  */  
  3.     private void toggleWiFi(Context context, boolean enabled) {  
  4.         WifiManager wm = (WifiManager) context  
  5.                 .getSystemService(Context.WIFI_SERVICE);  
  6.         wm.setWifiEnabled(enabled);  
  7.     }  

2. 打开移动网络比较麻烦,系统没有直接提供开放的方法,只在ConnectivityManager类中有一个不可见的setMobileDataEnabled方法,查看源代码发现,它是调用IConnectivityManager类中的setMobileDataEnabled(boolean)方法。由于方法不可见,只能采用反射来调用:
[java] view plaincopy
 
  1. /**   
  2.  * 移动网络开关   
  3.  */   
  4. private void toggleMobileData(Context context, boolean enabled) {    
  5.     ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);    
  6.     Class<?> conMgrClass = null// ConnectivityManager类    
  7.     Field iConMgrField = null// ConnectivityManager类中的字段    
  8.     Object iConMgr = null// IConnectivityManager类的引用    
  9.     Class<?> iConMgrClass = null// IConnectivityManager类    
  10.     Method setMobileDataEnabledMethod = null// setMobileDataEnabled方法    
  11.     try {     
  12.         // 取得ConnectivityManager类     
  13.     conMgrClass = Class.forName(conMgr.getClass().getName());     
  14.     // 取得ConnectivityManager类中的对象mService     
  15.     iConMgrField = conMgrClass.getDeclaredField("mService");     
  16.     // 设置mService可访问    
  17.         iConMgrField.setAccessible(true);     
  18.     // 取得mService的实例化类IConnectivityManager     
  19.     iConMgr = iConMgrField.get(conMgr);     
  20.     // 取得IConnectivityManager类     
  21.     iConMgrClass = Class.forName(iConMgr.getClass().getName());     
  22.     // 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法     
  23.     setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);     
  24.     // 设置setMobileDataEnabled方法可访问     
  25.     setMobileDataEnabledMethod.setAccessible(true);     
  26.     // 调用setMobileDataEnabled方法     
  27.     setMobileDataEnabledMethod.invoke(iConMgr, enabled);    
  28.     } catch (ClassNotFoundException e) {     
  29.         e.printStackTrace();    
  30.     } catch (NoSuchFieldException e) {     
  31.         e.printStackTrace();    
  32.     } catch (SecurityException e) {     
  33.         e.printStackTrace();    
  34.     } catch (NoSuchMethodException e) {     
  35.         e.printStackTrace();    
  36.     } catch (IllegalArgumentException e) {     
  37.         e.printStackTrace();    
  38.     } catch (IllegalAccessException e) {     
  39.         e.printStackTrace();    
  40.     } catch (InvocationTargetException e) {     
  41.         e.printStackTrace();    
  42.     }   
  43. }  



3. 打开GPS也比较麻烦,与打开移动网络一样,没有直接的方法。在网上搜索了一下,据说采用反射去调用系统的方法仍然会失败,有网友用另外一条路实现了同样的功能,在2.3.5系统测试可以通过,在4.1.1系统中测试无效,待解决:
[java] view plaincopy
 
  1. /**   
  2.  * <p>GPS开关   
  3.  * <p>当前若关则打开   
  4.  * <p>当前若开则关闭   
  5.  */   
  6. private void toggleGPS() {    
  7.     Intent gpsIntent = new Intent();    
  8.     gpsIntent.setClassName("com.android.settings""com.android.settings.widget.SettingsAppWidgetProvider");    
  9.     gpsIntent.addCategory("android.intent.category.ALTERNATIVE");  gpsIntent.setData(Uri.parse("custom:3"));    
  10.     try {     
  11.         PendingIntent.getBroadcast(this0, gpsIntent, 0).send();    
  12.     } catch (CanceledException e) {     
  13.         e.printStackTrace();    
  14.     }   
  15. }  

 

分享到:
评论

相关推荐

    深入理解Android:WiFi模块 NFC和GPS卷.邓凡平(文字版).pdf

    《深入理解Android:WiFi模块 NFC和GPS卷》是由邓凡平编著的一本技术书籍,主要探讨了Android系统中三个重要的无线通信技术:WiFi、NFC(近场通信)和GPS(全球定位系统)。这本书以文字版的形式,深入浅出地讲解了...

    深入理解Android:WIFI模块 NFC和GPS卷

    这本书详细阐述了Android平台下WiFi、NFC(近场通信)以及GPS(全球定位系统)的工作原理、开发实践和应用案例,对于想要在移动设备上实现高效网络连接、智能交互和精准定位的开发者来说,是一份不可多得的参考资料...

    Android_GPS_WIFI_网络定位

    在MapABCAndroidApiDemos这个项目中,通常会包含一系列关于地图API的示例代码,可能包括使用GPS、WIFI和网络定位功能来显示用户当前位置、路径规划、地理编码(将地址转换为坐标)和反地理编码(将坐标转换为地址)...

    安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip

    在安卓(Android)系统中,定位服务是移动应用开发中的重要组成部分,主要依赖于GPS(全球定位系统)和WIFI基站来获取设备的位置信息。这个压缩包“安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip”提供...

    android定位(基站,GPS,wifi)齐全

    `Android实现GPS定位.pdf`和`Android实现GPS定位(1).pdf`可能包含关于如何在Android应用中启用和使用GPS服务的教程。通常,开发者需要请求权限,调用LocationManager服务,注册GPS监听器,然后解析接收到的位置更新...

    深入理解Android WiFi模块 NFC和GPS卷

    在Android操作系统中,WiFi、NFC(近场通信)和GPS是三个至关重要的移动通信技术。本篇文章将针对这些主题进行深入探讨,旨在为初学者提供一个全面且基础的了解。 首先,我们来讨论Android WiFi模块。WiFi是无线...

    深入理解Android:WiFi模块 NFC和GPS卷 - 邓凡平.zip

    在Android系统中,GPS与网络定位(WiFi和移动网络)、传感器等结合,为用户提供精准的位置信息。本书将深入解析Android的定位框架,包括如何开启和关闭GPS,如何获取连续的定位更新,以及如何处理定位权限和隐私问题...

    android gps wifi 基站 定位齐全。源码

    总的来说,这个源码包提供了学习和实践Android定位服务的宝贵资源,涵盖了从基础的GPS定位到更复杂的WiFi和基站定位,以及可能的融合定位策略。对于任何想要提升Android定位技能的开发者来说,这是一个很好的学习...

    深入理解Android:WiFi模块 NFC和GPS卷 - 邓凡平-4

    《深入理解Android:WiFi模块 NFC和GPS卷》是邓凡平先生的一本深入解析Android系统中无线通信技术的专业书籍,主要涵盖了Android系统中WiFi、NFC(近场通信)和GPS(全球定位系统)这三个重要模块。这本书对于...

    Android Wifi Lbs 定位

    Android WiFi LBS(Location-Based Services,基于位置的服务)定位是通过结合WiFi网络信号和移动通信基站信息来确定设备的位置。这种定位方式在GPS信号不可用或者信号弱的室内环境尤为实用。下面将详细介绍Android ...

    android 基于基站,apn,gps,wifi,network 根据不同手机sim卡获取经纬度

    Android中使用`LocationManager`服务和`GpsLocationProvider`来获取GPS位置。 2. **基站定位(Cell ID)**:基于手机连接的移动网络基站信息来确定位置。它依赖于运营商的基站数据,适用于城市环境,但精度较低,...

    android网络测速app源代码

    9. **异常处理**:在网络测速过程中,可能会遇到网络连接问题、服务器错误等情况,因此需要编写异常处理代码,确保App在遇到问题时能优雅地处理并给出反馈。 10. **性能优化**:考虑到移动设备的资源限制,开发者还...

    深入理解Android WiFi NFC和GPS卷(邓凡平)

    《深入理解Android WiFi NFC和GPS卷》是由邓凡平撰写的一本专著,全面解析了Android系统中的无线网络、近场通信以及定位技术的核心概念与实现机制。这本书旨在帮助开发者和爱好者深入掌握这三个关键技术,提升在...

    android google 定位程序 wifi基站GPS定位

    在Android平台上,Google提供了一套全面的定位服务,使得开发者能够轻松实现基于GPS、Wi-Fi基站和移动网络的综合定位功能。这篇文档将详细介绍如何在Android应用中利用这些技术进行定位。 首先,我们需要理解...

    Android的基站、WIFI、GPS定位集合

    它利用了移动网络基础设施,无需开启GPS,所以在室内或城市环境中具有较好的可用性。基站定位的精度受到基站分布密度的影响,城市中基站密集,因此精度相对较高,但在偏远地区或农村,由于基站稀疏,定位可能不太...

    Android的基站、WIFI、GPS定位集合【源码】.zip

    在Android中,使用`WifiManager`类和`LocationManager`服务结合,通过`addWifiListener()`监听WIFI信号,并调用`requestLocationUpdates()`请求定位更新。WIFI定位在城市环境中精度较高,但依赖于WIFI热点的密度。 ...

    深入理解android-WIFI、NFC、GPS.pdf

    综上所述,《深入理解Android:Wi-Fi、NFC和GPS卷》是一本全面覆盖Android平台上三大关键模块的专业书籍,不仅适合Android系统工程师、应用开发工程师和BSP开发工程师阅读,也为那些希望深入了解移动通信技术的读者...

    Android WIFI状态监控

    在Android平台上,对WIFI状态的监控是移动应用开发中的一个重要功能,特别是在涉及网络连接、定位服务或数据传输的应用中。本文将详细讲解如何在Android中监控WIFI的状态,并介绍相关知识点。 首先,Android提供了`...

    Android内置GPS与百度GPS对比.zip

    在网络条件良好的情况下,百度GPS可以快速给出初步的位置信息,尤其在城市环境和室内,其定位速度往往优于内置GPS。此外,百度还提供了定位优化算法,如差分GPS技术,进一步提高了定位精度。 从源码角度来看,...

    android 基站、WIFI、GPS定位集合【源码】

    在Android平台上,实现精准的位置服务是开发者们常常面临的需求,这通常涉及到三种主要的定位技术:基站定位、Wi-Fi定位和GPS(全球定位系统)定位。这篇内容将深入探讨这些定位方式以及它们在源码中的实现。 1. **...

Global site tag (gtag.js) - Google Analytics