Android Bluetooth изнутри Сервис - PullRequest
4 голосов
/ 10 марта 2010

У меня есть сервис, который теоретически может работать без активности, связанной с ним (так как «сервисы» предназначены для платформы Android).

Эта служба использует Bluetooth, в частности, регистрирует службу Bluetooth с указанным именем, которое прослушивает связь. Конечно, чтобы он работал, Bluetooth должен быть активным.

Как также показано в документах API Bluetooth, я использую BluetoothAdapter.ACTION_REQUEST_ENABLE, чтобы предложить пользователю включить Bluetooth, если он еще не включен. Это, однако, действие, и поэтому его нужно вызывать из другого действия, т.е.

Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
InstanceOfAnActivity.startActivity(enableIntent);

Чего я хотел бы добиться, так это иметь службу (которая, например, запускается при загрузке), полностью отделенную от любого действия, и, следовательно, не имела бы InstanceOfAnActivity для запуска всплывающей подсказки пользователю включить Bluetooth.

Теперь я знаю, что есть (позорный) вызов BluetoothAdapter.enable(), но, как говорит док, его нельзя вызывать напрямую.

Итак, какой совет / решение этой дилеммы? (Может быть, это легко, и я просто что-то упустил ...)

Ответы [ 2 ]

5 голосов
/ 16 апреля 2011

startActivity() не является строго методом Activity - это метод Context, унаследованный службой Activity и . Однако следует помнить одну вещь - как указано в Service.startActivity() документе: «если этот метод вызывается извне контекста действия, то в намерении должен быть указан флаг запуска FLAG_ACTIVITY_NEW_TASK».

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

Intent btIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
btIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(btIntent);
1 голос
/ 10 марта 2010

Вот что говорит доктор

Bluetooth никогда не должен быть включен без прямого согласия пользователя. Если вы хотите включить Bluetooth для создания беспроводного соединения, вы должны использовать намерение ACTION_REQUEST_ENABLE, которое вызовет диалог, запрашивающий разрешение пользователя. включить Bluetooth. Метод enable () предоставляется только для приложений, которые включают пользовательский интерфейс для изменения системных настроек, например, приложение «Power Manager».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...