0

我创建了一个带有按钮的应用程序,该按钮允许打开和关闭飞行模式。打开飞行模式时工作正常。但奇怪的是,飞行模式在关闭时似乎保持打开状态。

如果我在关机后检查手机设置,它们表明飞行模式已关闭。但是飞行模式图标仍然显示在手机的顶部栏中,按住手机的电源按钮显示飞行模式仍然处于开启状态。

不知道为什么设置仍然打开时会显示为关闭?

这是我用来关闭它的代码 - 我已经调试过,它肯定会遇到这个问题。mContext 是我用来保存上下文的变量,它被传递到设置类中,然后该类具有用于关闭和打开飞行模式的方法:

System.putInt(mContext.getContentResolver(),
android.provider.Settings.System.AIRPLANE_MODE_ON, 0);
this.airplaneOn = false;
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", 0);
mContext.sendBroadcast(intent);

这是我用来检查飞行模式状态的代码 -

public boolean isAirplaneOn() {
  int airplaneMode = 0;
  try {
    airplaneMode = System.getInt(mContext.getContentResolver(),
  android.provider.Settings.System.AIRPLANE_MODE_ON);
    } catch (SettingNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if (airplaneMode == 1) {
        this.airplaneOn = true;
    } else {
        this.airplaneOn = false;
    }
    return airplaneOn;
}

在这两种情况下,this.airplaneOn 都是一个私有布尔值,用于存储飞行模式的状态。

我可以在这里做一些愚蠢的事情,还是检查这个设置有点不可靠?

4

3 回答 3

4

我已经成功执行了以下代码:

public static boolean isFlightModeEnabled(Context context) {
    return Settings.System.getInt(context.getContentResolver(),
        Settings.System.AIRPLANE_MODE_ON, 0) == 1;
}

public static void toggleFlightMode(Context context) {
    boolean isEnabled = isFlightModeEnabled(context);

    Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    intent.putExtra("state", !isEnabled);
    context.sendBroadcast(intent);
}

我在我的代码和你的代码之间看到的唯一区别是,在你的 putInt() 中你硬编码了 0。

要注意的另一件事是根据文档,ACTION_AIRPLANE_MODE_CHANGED

This is a protected intent that can only be sent by the system.

我过去没有遇到过这个问题,但也许你的设备更新了,并且执行了一些我已经成功使用的旧手机没有执行的功能。

于 2012-06-08T02:37:33.763 回答
1

Use a boolean instead of 0/1 for your intent, ie: intent.putExtra("state", true). The code in the other post should work properly.

于 2012-06-08T02:20:56.320 回答
0

参考以下代码:

@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:

// //

于 2013-12-31T06:03:54.150 回答