【问题标题】:How to provide option to select wi-fi or GPRS for network connectivity in android app如何在 android 应用程序中提供选择 wi-fi 或 GPRS 进行网络连接的选项
【发布时间】:2012-07-24 15:59:56
【问题描述】:

在我的应用程序中,我想为用户提供选择 wi-fi / GPRS 的选项,以实现与 Web 服务器的网络连接。可能是以下问题的答案解决我的问题... 1.如何查看当前默认的网络连接选项是启用的。 2. 如何在用户选择时启用 wi-fi/GPRS 或(如果用户选择 GPRS,则禁用 wi-fi - 如果 GPRS 工作仅需要此选项)

或者有其他方法可以做到这一点吗?

【问题讨论】:

    标签: android android-wifi gprs


    【解决方案1】:

    试试这个:

    ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    
    if (mWifi.isConnected())
        //if wifi connected
    }
    
    ConnectivityManager connManager1 = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo mMobile = connManager1.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    
    if (mMobile.isConnected()) {
        //if internet connected
    }
    

    不要忘记在清单文件中添加这些权限;

    android.permission.CHANGE_WIFI_STATE
    android.permission.ACCESS_WIFI_STATE
    android.permission.UPDATE_DEVICE_STATS
    android.permission.CHANGE_NETWORK_STATE
    android.permission.ACCESS_NETWORK_STATE
    android.permission.MODIFY_PHONE_STATE
    android.permission.READ_PHONE_STATE
    

    要启用或禁用 Wifi,请使用 mWiFi.setWifiEnabled(true|false)

    要启用/禁用 GPRS/3G,请使用以下代码 sn-p。

    void turnData(boolean ON) throws Exception
    {
    
    if(bv == Build.VERSION_CODES.FROYO)
    {
    
        Log.i("version:", "Found Froyo");
        try{ 
            Method dataConnSwitchmethod;
            Class telephonyManagerClass;
            Object ITelephonyStub;
            Class ITelephonyClass;
            TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
    
            telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
        Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
        getITelephonyMethod.setAccessible(true);
        ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
        ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
    
        if (ON) {
             dataConnSwitchmethod = ITelephonyClass.getDeclaredMethod("enableDataConnectivity"); 
    
        } else {
            dataConnSwitchmethod = ITelephonyClass.getDeclaredMethod("disableDataConnectivity");
        }
        dataConnSwitchmethod.setAccessible(true);
        dataConnSwitchmethod.invoke(ITelephonyStub);
        }catch(Exception e){
              Log.e("Error:",e.toString());
        }
    
    }
     else
    {
       Log.i("version:", "Found Gingerbread+");
       final ConnectivityManager conman = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
       final Class conmanClass = Class.forName(conman.getClass().getName());
       final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
       iConnectivityManagerField.setAccessible(true);
       final Object iConnectivityManager = iConnectivityManagerField.get(conman);
       final Class iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
       final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
       setMobileDataEnabledMethod.setAccessible(true);
       setMobileDataEnabledMethod.invoke(iConnectivityManager, ON);
    }
    

    }

    【讨论】:

    • +1 用于互联网数据虽然我没有设法以这种方式激活 wifi,因为 setWifiEnabled 是 WifiManager 的一种方法 这对我有用 WifiManager wifiManager = (WifiManager)this.getApplicationContext().getSystemService(上下文.WIFI_SERVICE); wifiManager.setWifiEnabled(true);
    【解决方案2】:

    您可以使用以下代码块在屏幕上为用户提供选项......

     public static ShowAvailable() 
     {
       ConnectivityManager connectivityMgr = (ConnectivityManager)
       getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo[] nwInfos = connectivityMgr.getAllNetworkInfo(); 
           for (NetworkInfo nwInfo : nwInfos)  
              {  
                 Log.d(TAG, "Network Type Name: " +
                 nwInfo.getTypeName());   Log.d(TAG, "Network available: " +
                 nwInfo.isAvailable());   Log.d(TAG, "Network c_or-c: " +
                 nwInfo.isConnectedOrConnecting());   Log.d(TAG, "Network connected: "
                 + nwInfo.isConnected()); 
              }
    
    }
    

    【讨论】:

      【解决方案3】:

      继续@rIHaN JiTHiN 的回答,应该注意两个权限android.permission.UPDATE_DEVICE_STATSandroid.permission.MODIFY_PHONE_STATE 只授予系统应用程序(因为它最初是在Eclipse 或Android Studio 中设置的)。所以如果有人会遇到这个问题,请查看this solution

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        相关资源
        最近更新 更多