Как я могу изменить поведение режима полета Android, чтобы он не выключал сотовую радиосвязь? - PullRequest
4 голосов
/ 28 ноября 2010

Я пытался создать простое приложение, которое позволит пользователю настраивать поведение режима полета в Android.Мотивация для этого от родственника, у которого есть Samsung Fascinate, и во время звонков он случайно включит режим полета.Это происходит, когда он держит телефон, случайно удерживает боковую кнопку питания / блокировки, что открывает диалоговое окно с меню «Тихий режим», «Режим полета» и «Выключение».Он случайно запускает режим полета от прикосновения телефона к своей щеке.Это сбрасывает вызов и раздражает его.

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

Я не ищуизменить исходный код Android или сделать что-то, что потребует рутирования.Я ищу решение в рамках стандартного фреймворка

Моя первая попытка решить эту проблему состояла в создании приложения, которое изменило бы System.AIRPLANE_MODE_RADIOS примерно так:

System.putString(getApplication().getContentResolver(), System.AIRPLANE_MODE_RADIOS, "");

СогласноAPI docs , эта константа представляет собой «список радиостанций, разделенных запятыми, которые необходимо отключить, когда включен режим полета».Кажется, что в режиме полета эта константа фактически не используется, и после внесения изменений она продолжает работать как обычно.

Моя следующая попытка состояла в том, чтобы создать BroadCastReceiver, получить действие AIRPLANE_MODE и отправить намерение для его отмены:

Intent am = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", 0);
context.sendBroadcast(am);

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

Кто-нибудь знает, как запретить режиму сотовой связи отключать сотовую радиосвязь?

Ответы [ 6 ]

6 голосов
/ 28 ноября 2010

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

2 голосов
/ 08 декабря 2010

Источник PhoneApp.java

https://android.googlesource.com/platform/packages/apps/Phone/+/gingerbread-release/src/com/android/phone/PhoneApp.java

Поясняет, почему это не сработает.

В отличие от реализаций Wi-Fi и Bluetooth, которые регистрируют приемник на Intent.ACTION_AIRPLANE_MODE_CHANGED, только когда в списке радиостанций режима полета PhoneApp делает это постоянно:

IntentFilter intentFilter =
new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);

И тогда безоговорочно действует на него:

if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
    boolean enabled = System.getInt(getContentResolver(),
            System.AIRPLANE_MODE_ON, 0) == 0;
    phone.setRadioPower(enabled);
}

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

0 голосов
/ 07 декабря 2010

Я не думаю, что вы сможете сделать это, поскольку это сделает режим самолета избыточным. Казалось бы, можно было бы как-то запретить запуск самолета. Я думаю, что решение, которое вы ищете, является плохой идеей, так как оно модифицирует приложение, делая его бесполезным, и в то же время позволяет ему работать. Проблема заключается в дизайне, который должен решить создатель телефона. У меня нет реального опыта работы с android (пока), но я бы предположил, что такой функциональности, которую вы ищете в стандартной среде, не будет.

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

0 голосов
/ 07 декабря 2010

У меня на рынке есть приложение под названием «Инструмент Wi-Fi в режиме полета», оно позволяет пользователю делать это следующим образом:

Settings.System.putString(getContentResolver(), 
        Settings.System.AIRPLANE_MODE_RADIOS, "cell,bluetooth");

По умолчанию RADIOS - это «cell, bluetooth, wifi»"(это радио, которые отключаются при включении режима полета.

0 голосов
/ 03 декабря 2010

Некоторые приложения изменяют фактический экран текущего вызова, и я знаю, что объект CityID, который был предварительно установлен на моем Fascinate (сообщает мне, что город, связанный с кодом города набираемого или набираемого номера) смогпрервите звонок прямо перед тем, как он наберет номер, чтобы сказать мне, чтобы зарегистрировать программное обеспечение.Если вы можете сделать свой собственный (полноэкранный) просмотр текущего вызова, похоже, у вас есть решение.Возможно, не самый элегантный, но он решает проблему.

Я знаю, что это можно сделать, потому что Opera-mini может перейти в «полный экран», и вы не можете перетащить меню задач сверху вниз;пользователь не виден в полноэкранном режиме.

0 голосов
/ 29 ноября 2010

Если режим полета запускается физической кнопкой, можно отменить действие нажатия кнопки. Хотя для этого я считаю, что для этого требуется root-доступ к системе.

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

...