问题
I would like to turn off the airplane mode if num>50, I implemented this code (from Toggle airplane mode in Android) but when executed I get a force close, can any one help here?
if(num>50){
// read the airplane mode setting
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
}
o.k. I implemented the premonitions but i would like to change the if statement:
if num>=50 and airplane mode=on toggle it off
if airplane mode=off and num<50 toggle it on
Can some one help me writing the new code? (I'm a newbie)
回答1:
You most likely did not add WRITE_SETTING
permissions to your AndroidManifest.xml
:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Also note that code:
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
Is not supposed to work, because according to documentation on ACTION_AIRPLANE_MODE_CHANGED:
This is a protected intent that can only be sent by the system.
And even though you can currently send this broadcast without System permissions, it may change in future releases of Android.
回答2:
Make sure to have set permissions for toggling airplane mode in your android manifest.
Take a look here Toggle airplane mode in Android
回答3:
Refer following code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter("android.intent.action.SERVICE_STATE");
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("AirplaneMode", "Service state changed");
Toast.makeText(getApplicationContext(), "Service state changed", Toast.LENGTH_LONG).show();
boolean isEnabled = isAirplaneModeOn(context);
/* setSettings(context, isEnabled?1:0);
Intent intent_mode = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent_mode.putExtra("state", !isEnabled);
context.sendBroadcast(intent_mode);*/
if(isEnabled==true)
{ setSettings(context, isEnabled?1:0);
Toast.makeText(getApplicationContext(), "Flight mode on", Toast.LENGTH_LONG).show();
Settings.System.putInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0);
Intent newIntent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
newIntent.putExtra("state", false);
sendBroadcast(newIntent);
}
else
{ setSettings(context, isEnabled?1:0);
Toast.makeText(getApplicationContext(), "Flight mode off", Toast.LENGTH_LONG).show();
}
}
@SuppressLint("NewApi")
private void setSettings(Context context, int value) {
// TODO Auto-generated method stub
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
Settings.System.putInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, value);
} else {
Settings.Global.putInt(
context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, value);
}
}
@SuppressLint("NewApi")
public boolean isAirplaneModeOn(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
return Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) != 0;
} else {
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
}
};
registerReceiver(receiver, intentFilter);
}
//permissions needed:
// //
来源:https://stackoverflow.com/questions/7066427/turn-off-airplane-mode-in-android