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がハードコーディングされていることです。

注意すべきもう1つのことは、ドキュメントによると、ACTION_AIRPLANE_MODE_CHANGED

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

私は過去にこれに問題を抱えたことはありませんが、おそらくあなたのデバイスはより新しく、私が成功した古い電話が強制しない何かを強制します。

于 2012-06-08T02:37:33.763 に答える
1

インテントには0/1ではなくブール値を使用します。つまり、intent.putExtra( "state"、true)です。他の投稿のコードは正しく機能するはずです。

于 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 に答える