2012-06-07 5 views
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

я имел успех делает следующий код:

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.

One другая вещь, чтобы быть в курсе, по документации, ACTION_AIRPLANE_MODE_CHANGED является

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

у меня не было проблем с этим в прошлое, но, возможно, ваше устройство новее и обеспечивает то, что у старых телефонов, с которыми у меня был успех, не обеспечивается.

+0

Это треснуло его - прохождение булевых вместо 0/1 действительно заставляет его работать. Отлично, спасибо! – vinnyh

1

Используйте логическое значение вместо 0/1 для вашего намерения, то есть: intent.putExtra ("state", true). Код в другом сообщении должен работать правильно.

+0

Да, он прекрасно работает - передавая логическое намерению сделал трюк! – vinnyh

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: 

// //

Смежные вопросы