2012-09-05 20 views
1

我需要禁用移动数据连接编程停用移动数据

我跟着这个

private void setMobileDataEnabled(Context context, boolean enabled) { 
    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); 
} 

StackOverFlow Link

,但我得到一个错误“显示java.lang.NullPointerException:需要的println消息”

日志

09-05 18:20:29.081: E/AndroidRuntime(736): FATAL EXCEPTION: Timer-0 
09-05 18:20:29.081: E/AndroidRuntime(736): java.lang.NullPointerException: println needs a message 
09-05 18:20:29.081: E/AndroidRuntime(736): at android.util.Log.println_native(Native Method) 
09-05 18:20:29.081: E/AndroidRuntime(736): at android.util.Log.d(Log.java:138) 
09-05 18:20:29.081: E/AndroidRuntime(736): at com.anand.batterysaver.BatterySaverActivity.checkScreenStatus(BatterySaverActivity.java:69) 
09-05 18:20:29.081: E/AndroidRuntime(736): at com.anand.batterysaver.BatterySaverActivity$1.run(BatterySaverActivity.java:43) 
09-05 18:20:29.081: E/AndroidRuntime(736): at java.util.Timer$TimerImpl.run(Timer.java:284) 

checkScreenStatus功能

public void checkScreenStatus(){ 
     PowerManager powermanager; 
     GetProcessList list = new GetProcessList(); 
     ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); 

     powermanager = (PowerManager) this.getSystemService(Context.POWER_SERVICE); 
     if (powermanager.isScreenOn() == false) 
     { 
      Log.d("PowerStatus","Lock All Settings"); 
      boolean gprsstatus = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED; 
      Log.d("Locked gprsStatus",String.valueOf(gprsstatus)); 
      if(gprsstatus == true){ 
       try{ 
        list.setDataEnabled(getApplicationContext(), false); 
       }catch (Exception e) {Log.d("Exception",e.getMessage()); } 
      } 
     }else{ 
      Log.d("PowerStatus","Resume All"); 
      gprsstatus = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED; 
      Log.d("Locked gprsStatus",String.valueOf(gprsstatus)); 
      if(gprsstatus == true){ 
       TelephonyManager gprs = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); 
       if(gprs.getDataState() == TelephonyManager.DATA_CONNECTED){ 
        Log.d("Gprs","on"); 
       } 
      } 
     } 
    } 
+0

发布完整的堆栈跟踪 – njzk2

回答

4

试试这个: 这工作(这是我在市场上的应用程序之一的代码)

private static void updateAPN(Context paramContext, boolean enable) { 
    try { 
     ConnectivityManager connectivityManager = (ConnectivityManager) paramContext.getSystemService("connectivity"); 
     Method setMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); 
     setMobileDataEnabledMethod.setAccessible(true); 
     setMobileDataEnabledMethod.invoke(connectivityManager, enable); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

奖励:

private static boolean isAPNEnabled(Context paramContext) { 
    try { 
     NetworkInfo networkInfo = ((ConnectivityManager) paramContext.getSystemService("connectivity")).getActiveNetworkInfo(); 
     return networkInfo.isConnected(); 
    } catch (Exception e) { 
     return false; 
    } 
} 

由不要忘了这个:

uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" 
uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" 
uses-permission android:name="android.permission.INTERNET" 
uses-permission android:name="android.permission.READ_PHONE_STATE" 
+0

其引发的异常println需要消息 – Bucks

+0

哼,我看起来多了一点你的异常,它似乎不是从你的setMobileDataEnabled函数抛出的,对吧? –

+0

请发布此函数的代码的完整stacktrace:turnData –

0

我用同样的方法,但我加抛出异常,如:

public static void setMobileDataEnabled(Context context, boolean enabled)throws Exception { 
     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); 
    } 

这样的方法被称为

try { 
    Tools.setMobileDataEnabled(getApplicationContext(), true); //true for enable, false for disable 
    } catch (Exception e) { } 
} 

,它为我工作。

+0

我不需要启用我需要禁用该 – Bucks

+0

Tools.setMobileDataEnabled(getApplicationContext(),false); 像这样改变这条线,这将禁用连接。 – nexusone

+0

同样的错误java.lang.NullPointerException:Println需要一个消息 – Bucks