2012-01-23 23 views
0

デバイスのネットワーク状態をソースコードから変更しようとしています。
ネットワーク状態を変更するためのアプリケーションに許可する権限があることがわかりました。つまり、CHANGE_NETWORK_STATEです。Androidのソースコードからデバイスのネットワーク状態を変更するにはどうすればよいですか?

しかし、デバイスのネットワーク状態を変更する可能性のある例やコードは見つかりません。

デバイスのネットワーク状態を誰かが知っているか、または変更した例がある場合は、教えてください。

よろしく、
SSuman185

+0

私の個人的なブログにこの件について書きました。それをチェックしてください http://www.oguzozkeroglu.com/android-enable-disable-wifi/ (それはトルコ語ですが、コードを理解することができます) – OguzOzkeroglu

答えて

3

このコードが機能しています。私はhereからそれを得た。

private void setMobileDataEnabled(Context context, boolean enabled) { 

     try { 
     final ConnectivityManager conman = (ConnectivityManager) context.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, enabled); 

     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchFieldException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally { 

     } 
    } 
+0

このコードはサービスからは機能しません。なぜなのかご存知ですか? – Kermia

1

あなたがここに

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
wifiManager.setWifiEnabled(true); 

により無線LANの状態を変更することができますが、here

のdataconnection無効にし、有効にするAPIが中に隠されているクリックに見ることができます答えていますこのSDKはユーザーに公開されませんが、これはJavaリフレクション技術を使用してITelephonyインターフェイスにアクセスすることで実現できます。ここ

あなたが行く:

Method dataConnSwitchmethod; 
Class telephonyManagerClass; 
Object ITelephonyStub; 
Class ITelephonyClass; 

TelephonyManager telephonyManager = (TelephonyManager) context 
     .getSystemService(Context.TELEPHONY_SERVICE); 

if(telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED){ 
    isEnabled = true; 
}else{ 
    isEnabled = false; 
} 

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 (isEnabled) { 
    dataConnSwitchmethod = ITelephonyClass 
      .getDeclaredMethod("disableDataConnectivity"); 
} else { 
    dataConnSwitchmethod = ITelephonyClass 
      .getDeclaredMethod("enableDataConnectivity"); 
} 
dataConnSwitchmethod.setAccessible(true); 
dataConnSwitchmethod.invoke(ITelephonyStub); 
+0

ありがとうございます。メソッドを取得したら、それらのメソッドを呼び出す方法を教えてください。また、これはGingerBread(2.3)のバージョンからもはやサポートされていないことがわかりました[Link:http://stackoverflow.com/questions/4715250/howアプリのランニング・オン・ジンジャーブレッド]をクリックします。本当ですか? – Suman

+0

dataConnSwitchmethod.setAccessible(true); dataConnSwitchmethod.invoke(ITelephonyStub); – AAnkit

+0

情報ありがとうございます。しかし、動作していない、私はMODIFY_PHONE_STATE権限例外を取得していますが、AndroidManifest.xmlファイルに同じものが追加されています。 wifiの投票。 – Suman

関連する問題