Проблема с использованием режима полета на Android

У меня есть проблема, чтобы использовать режим полета в моем приложении. Приложение отлично работает на моем эмуляторе, но не на моем реальном телефоне, когда я пробую свой apk.

Вот код для активации Самолета:

Settings.System.putInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 1);
        // Post an intent to reload
        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        // send a broadcast
        //intent.putExtra("state", !isEnabled);
        intent.putExtra("state", true);
        sendBroadcast(intent);

Чтобы деактивировать это:

Settings.System.putInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0);
        // Post an intent to reload
        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        // send a broadcast
        intent.putExtra("state", false);
        sendBroadcast(intent);

Я прочитал, что я не могу создать намерение ( Android Doc), но я видел людей, которые могли бы сделать режим самолета, поэтому я не понимаю!

Спасибо, чтобы помочь мне!

4 ответа

Вы НЕ МОЖЕТЕ транслировать намерения системного уровня. Это незаконно по стандартам Android.

Вместо того, чтобы пытаться отправить намерение, почему бы вам просто не реализовать широковещательный приемник для прослушивания этого конкретного действия, а затем, когда оно изменится, ваше приложение обработает его. Это был бы намного лучший подход. Вы не можете и не должны ожидать управления режимом полета, но ваше приложение может слушать, когда оно вызывается. Вы также можете получить свойство из системной базы данных, которое сообщит вам, находится ли оно в режиме полета.

Еще раз Не сосредотачивайтесь на том, чтобы пытаться управлять этим, только обращайтесь с этим.

Как законное приложение для Android, вы не можете делать то, что пытаетесь сделать, включая перевод телефона в режим полета, отключение радиоприемников, отключение звука или что-либо в этом роде.

Представьте себе, что бы вы, пользователь, чувствовали, если бы какое-то произвольное приложение выключило телефонную радиостанцию, и вы пропустили этот звонок, который сообщал бы вам, что вы выиграли миллион долларов.

Так что все пытаются добраться до вас, это то, что вы как приложение не должны ожидать перевода телефона в режим полета. Только пользователь может сделать это.

Теперь, если пользователь переходит в режим полета, система передает намерение, ваше приложение должно перехватить это намерение и действовать в соответствии с ним. Действовать в соответствии с этим означает множество вещей, которые включают изменение вашего пользовательского интерфейса.

Даже если вы найдете способ достичь того, что вы пытаетесь сделать сегодня, система может измениться завтра без предупреждения (поскольку это внутренний API/Intent), и ваше приложение не будет работать. Технически, он может не функционировать ни на каком другом устройстве, кроме того, которое у вас в руке, вы знаете всю чушь контрактов API.

public static void setWifiOn(Context context) {
      WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    manager.setWifiEnabled(true);
    }

  public static boolean getAirplaneMode(Context context) {
      try {
      int airplaneModeSetting = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);
      return airplaneModeSetting==1?true:false;
    } catch (SettingNotFoundException e) {
      return false;
    }
  }

Как вы заявили, ответ находится в документации:

"Это защищенное намерение, которое может быть отправлено только системой".

Документация по намерениям

Он может работать на эмуляторе, потому что эмулятор не является защищенным устройством и позволяет вам делать вещи (например, просматривать файловую систему), которые вы обычно не сможете сделать. Кроме того, вы не упомянули, какой уровень API Android вы пытаетесь использовать. Если это актуально, Google, возможно, ужесточил ограничение.

Другие вопросы по тегам