在ConnectivityManager中有一个@hide的setMobileDataEnabled()方法,不过我是在源码中开发,应该不需要用到反射。
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(false);
报空指针异常,有高手做过这方面吗?不知能否指点一二,不胜感激。
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(false);
报空指针异常,有高手做过这方面吗?不知能否指点一二,不胜感激。
private static final String TAG = "StatusBar.DataEnabledController"; private Context mContext;
private CompoundButton mCheckBox;
private boolean mAirplaneMode;
private boolean mDataEnabled;
ConnectivityManager cm;
public DataEnabledController(Context context, CompoundButton checkbox) {
mContext = context;
cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
mDataEnabled = getDataEnabled();
mAirplaneMode = getAirplaneMode();
mCheckBox = checkbox;
checkbox.setEnabled(!mAirplaneMode);
setCheckBoxVisible(!mAirplaneMode);
checkbox.setChecked(mDataEnabled);
checkbox.setOnCheckedChangeListener(this);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
context.registerReceiver(this, filter);
} public void onCheckedChanged(CompoundButton view, boolean checked) {
if (checked != mDataEnabled && !mAirplaneMode) {
setDataEnabled(checked);
}
} private void setCheckBoxVisible(boolean isVisible){
int visible = View.VISIBLE;
visible = isVisible?View.VISIBLE:View.INVISIBLE;
mCheckBox.setVisibility(visible);
}
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
final boolean enabled = intent.getBooleanExtra("state", false);
if (enabled != mAirplaneMode) {
mAirplaneMode = enabled;
mCheckBox.setEnabled(!mAirplaneMode);
setCheckBoxVisible(!mAirplaneMode);
}
}
} private boolean getAirplaneMode() {
ContentResolver cr = mContext.getContentResolver();
return 0 != Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0);
}
private boolean getDataEnabled() {
if(cm == null){
cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
}
return cm.getMobileDataEnabled();
}
private void setDataEnabled(final boolean dataEnabled) {
mDataEnabled = dataEnabled;
AsyncTask.execute(new Runnable() {
public void run() {
if(cm == null){
cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
}
cm.setMobileDataEnabled(mCheckBox.isChecked());
}
});
}
}