Программа для перенаправления звука на андроид
О том, что стоящий в твоей комнате традиционный телефон с аккуратно лежащей на нем трубкой все равно может за тобой шпионить, известно чуть ли не со времен А. Г. Белла. Смартфоны продвинулись по этой скользкой дорожке значительно дальше. А как все это выглядит с программной точки зрения?
В этой статье мы рассмотрим программу, установленную на телефоне с операционной системой Android, которая без палева передает данные на сервер, установленный на персональном компьютере. Для решения поставленной задачи нам потребуется несколько вещей. В первую очередь это желание, а затем такие мелочи, как телефон (с операционной системой Android), компьютер и интернет. Начнем с разработки алгоритма взаимодействия клиента и сервера.
Исключительно в образовательных целях!
Автор и редакция напоминают, что вся представленная в статье информация опубликована исключительно в образовательных целях. В конце концов, запись аудио и передача его на сайт – задача не редкая, нужная и монетизируемая в самых обычных приложениях. Не нарушай закон!
Все операции обмена данными между клиентом и сервером будут происходить по протоколу TCP/IP. В связи с тем что все взаимодействия представляют собой пересылку последовательности байт от клиента к серверу или наоборот, необходимо разработать формат отправляемых пакетов данных. Кроме непосредственно данных, будем также передавать дополнительную информацию, а именно размер пакета и идентификатор команды.
Ниже описана разработанная система команд между клиентом и сервером. Все команды передаются побайтово в следующем формате:
- 0 — успешно выполнено;
- -1 — произошла ошибка;
- 1 — подключение клиента;
- 2 — начало записи;
- 3 — отправка записанного AAC-файла;
- 4 — отправка записанного WAV-файла;
- 5 — потоковая передача данных;
- 6 — потоковая передача WAV-заголовка.
Для начала давай зададимся вопросом, а что должен делать клиент. В нашем случае необходимо, чтобы телефон записывал звук в фоновом режиме, после чего незаметно для пользователя отправлял файл со звуком на сервер. Причем начинать запись телефон будет только с того момента, как пользователь нажмет кнопку записи, а общее время записи задает сам пользователь в настройках программы. Итак, задача поставлена, необходимо найти ее решение. На борту нашего клиент-телефона установлена операционная система Android. Из этого очевиден выбор языка программирования — им становится Java.
Для написания клиента установим на персональный компьютер IDE Eclipse и Android SDK. Для работы данных компонентов необходим установленный комплект разработчика приложений Java Develovoper Kit. После настройки всех необходимых компонентов подключаем к компьютеру телефон (не забываем про ОС Android) с включенной возможностью отладки по USB. Теперь ты готов кодить! Создай проект в Eclipse и начинай писать программу. Написать класс для подключения к серверу труда не составит. Основные поля этого класса: Socket (программный интерфейс для обеспечения обмена данными между клиентом и сервером.), IP (адрес для подключения), Port (параметр протоколов TCP и UDP) , поток для приема данных, поток для передачи данных. Следуя принципам объектно-ориентированного программирования, все поля делаем приватными (private). В этом классе реализуем метод sendPacket() и задаем его тип synchronized. Synchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени, а данные, измененные одним потоком, будут видны всем другим потокам. В методе sendPacket() при отправке данных создаем блок обработки исключений. Если возникает исключение, информацию о нем записываем в лог и закрываем сокет.
GUI мобильного приложения
Но на этом не стоит останавливаться, потребуется класс для записи данных (звука) (WavRecorder). Для этого класса необходимо описать:
- количество бит на семпл (описываем в виде константы RECORDER_BPP = 16);
- количество каналов записи (CHANNELINMONO);
- формат записи (ENCODINGPCM16BIT);
- флаг, показывающий, идет ли в данный момент запись (по умолчанию false);
- идентификатор устройства;
- IP-адрес сервера;
- номер порта на сервере.
Все поля класса также делаем приватными.
Подробный код ты можешь посмотреть в файле WavStreamer.java. Для самого простого клиента этих классов и методов будет достаточно. Создадим экземпляр Socket’a и будем коннектиться к серверу (о котором речь пойдет далее). В случае удачного присоединения к серверу программа ожидает дальнейших указаний пользователя о необходимости записи. Если соединение не установлено, пользователь должен быть проинформирован об этом (в нашем случае ошибкой соединения). Если мы хотим начать запись, то клиент должен сообщить об этом серверу. Клиент отправляет пакет данных, в котором есть некий код. По этому коду наш сервер понимает, что клиент начал запись. Для старта записи звука в программе создается поток WavRecorder. Этот поток записывает звуковые данные с микрофона клиента-телефона. Для дальнейшего открытия записанного файла в аудиопроигрывателе необходимо записать заголовок, который состоит из определенным образом сформированной последовательности данных (байт).
Схема взаимодействия
Данная последовательность представляет собой определенным образом созданный байтовый массив. Подобный массив описывается во многих интернет-источниках, если тебе не хочется искать его на просторах глобальной сети, то можешь посмотреть в исходниках (он расположен в файле WavStreamer.java).
Казалось бы, все должно работать… Но возникает вопрос: почему не работает? Так как мы пользовались функциями интернета и записи аудио, необходимо сообщить виртуальной Java-машине Dalvik о том, что наше приложение пользуется этими системными функциями. Давай заглянем в файл AndroidManifest.xml и добавим в него следующие строчки:
После этого Java-машина предоставит доступ к запрашиваемым системным функциям, описываемым в манифесте.
После добавления некоторых элементов интерфейса наш клиент полностью готов, и можно переходить к написанию сервера.
Qt — кросс-платформенный инструментарий разработки ПО. Он включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML.
Одну из основных особенностей Qt составляет повсеместное применение концепции сигналов и слотов, использующихся для взаимодействия между объектами. По своей сути слот — это метод класса, который вызывается, когда происходит какое-либо событие (сигнал). Это сильно облегчает разработку графических интерфейсов или работу с сетью. Достаточно подписаться на какой-то сигнал, который генерирует сам Qt или один из классов программы, и нужная функция-обработчик будет автоматически вызвана при его наступлении.
Уведомление во время активной записи
Теперь перейдем к описанию структуры сервера. Основным классом сервера является MyServer, который инкапсулирует в себе объект типа QTcpServer, отвечающий за сетевое взаимодействие. MyServer на вход подается номер порта и IP, на котором будет работать QTcpServer. В обязанности данного класса входит управление новыми соединениями и перенаправление подключенных клиентов на другой класс. Для начала запустим QTcpServer, передав ему входные данные, и установим обработчик (слот) на сигнал типа newConnection(). Этот сигнал генерируется объектом класса QTcpServer при появлении нового соединения. В случае успешного запуска сервер переходит в режим сканирования порта. Обработчик новых подключений передает задачу по считыванию поступающих данных на объект типа User.
Класс User при помощи функции getMessage() обрабатывает поступающие данные и вызывает соответствующую функцию для обработки запроса от клиента.
При желании можно добавить различные фичи в этот проект. Один из вариантов дальнейшего развития — это сервер, находящийся не на компьютере пользователя, а где-нибудь в облаке. Кроме «облачного сервера», можно создать учетные данные пользователя — один и тот же человек может совершать запись звука с различных телефонов. Но хранить данные в разных папках ему будет неудобно.
Решить эту проблему способна учетная запись пользователя. При вводе своих данных пользователь сможет добавлять файлы с телефона другого человека в свой каталог. Правда, реализация данных новшеств привносит и новые задачи. При создании системы учетных записей необходимо хранить базу данных клиентов, с их логинами и паролями. Причем эта база данных должна быть хорошо защищена. Ведь никому не хочется, чтобы его файлы были всем доступны :).
В случае с «облачным сервером» возникает проблема доступа к данным, полученным с мобильного устройства. Решить эту проблему можно путем создания специального клиента-администратора, который получает доступ к данным под конкретной учетной записью и только под ней. Защита звуковых данных пользователя прежде всего!
Поставленная нами в начале статьи цель достигнута. Теперь, запустив нашу программу и «случайно» оставив где-нибудь телефон, ты узнаешь о том, что за спиной говорят про тех, кто оставляет свой дорогостоящий смартфон без присмотра :). При этом телефон для всех окружающих находится в спящем режиме, а файлов с записанным звуком на нем не будет.
Думаю, не ошибусь, если предположу, что у каждого из вас есть по крайней мере два-три, а то и больше Bluetooth-аксессуаров, которые вы подключаете к своему смартфону. Лично у меня это две пары наушников и две беспроводные колонки. Это откровенно скудный набор, но даже с ним мне зачастую приходится очень тяжело из-за необходимости вручную сопрягать каждый аксессуар со смартфоном, когда это становится нужно. Нельзя просто взять, поднести его к наушникам или колонке, как это делают устройства Apple. Нет, нужно заходить в настройки и подключаться к гаджету вручную. Но в какой-то момент мне это надоело, и я нашёл решение.
Не знаете, как удобно переключаться между аудиоустройствами? Я вас научу
Оказывается, на Android есть приложения, которые позволяют переключаться между разными Bluetooth-устройствами всего лишь в одно нажатие. Да, как вы понимаете, таких приложений довольно много.
Как подключать и отключать беспроводные наушники
Если в двух словах, то предназначение приложения Bluetooth Audio Device Widget заключается в том, чтобы сделать несколько виджетов, относящихся ко всем вашим Bluetooth-устройствам, разместить их на рабочем столе, а потом быстро между ними переключаться в одно нажатие.
Правда, учитывайте, что переключение будет происходить только с аудио-приборами. Например, использовать Bluetooth Audio Device Widget для переключения с наушников на, скажем, фитнес-браслет невозможно, да и не имеет смысла. Однако имейте в виду эту особенность и не предъявляйте к приложению больше требований, чем оно заслуживает.
-
приложение Bluetooth Audio Device Widget из Google Play;
- Запустите приложение и дайте необходимые разрешения;
Добавьте виджет устройства на рабочий стол
- Вернитесь на рабочий стол и перейдите в режим изменения;
На экран можно добавить сразу несколько виджетов устройств
- Откройте вкладку с виджетами и найдите виджет Bluetooth Audio Device Widget;
- Выберите устройства, виджеты которых хотите разместить на рабочем столе, и нажмите на синюю стрелку.
Быстрое переключение между Bluetooth-устройствами
Переключаться между Bluetooth-устройствами благодаря виджетам можно мгновенно
Теперь, когда мне нужно переключиться между ними, я просто нажимаю на нужный виджет, и смартфон автоматически меняет соединение. Таким же образом можно просто отключаться от аксессуара, если есть необходимость прекратить воспроизведение.
Очень важно, что Bluetooth Audio Device Widget может переключаться между разными Bluetooth-устройствами только в том случае, если они были ранее подключены. В противном случае они не появятся в списке сопряжённых и даже из самого приложения вы не сможете выбрать новый гаджет для воспроизведения.
Для удобства пользователей на виджете будет располагаться иконка с текущим зарядом устройства либо дополнительными подробностями, если колонка или аудиосистема, к примеру, не имеют встроенного аккумулятора, а питания от электросети или внешней батареи, как в случае с автомобильными аудиосистемами.
Свободное общение и обсуждение материалов
Можно ли танцевать под рэп? Достаточно послушать новый альбом Sfera EbbastaЕсть большая вероятность, что если вы купите смартфон в 2020 или 2021 году, то у вас есть TWS-наушники. AirPods от Apple оказались настолько успешными, что Sony, Samsung и даже аудиофильские компании почувствовали давление. В итоге все они начали делать свои наушники, которым провод нужен только для того, чтобы заряжаться (и то не всегда). Преимущества перехода на полностью беспроводное соединение очевидны: компактный размер, меньше путаницы и многие другие. Тем не менее, почти у всех наушников такого типа есть один серьезный недостаток, с которым надо как-то бороться. Эти наушники постоянно выпадают из ушей даже тех, кому они подходят. Надо ли рассказывать, насколько легко их потерять? Лучше обсудим, почему так происходит и можно ли как-то противостоять этому.
Тем, кто собирается покупать себе айфон гораздо удобнее. У них нет большой необходимости подолгу выбирать бренд, копаться в разных характеристиках и тому подобное. С другой стороны, такой пользователь получается сильно ограничен. По сути, у него нет выбора вообще. Все, что он может сделать - выбрать одну модель из пяти и выбрать объем встроенной памяти. На Android же все иначе: процессор, экран, камера, материалы корпуса, биометрическая защита и многое другое. Причем даже если получится найти телефон, полностью соответствующий вашему запросу, не факт, что он вам понравится.
Защищать данные на своем смартфоне - необходимость. Причем по-настоящему безопасных способов для осуществления необходимой всем гаджетам функции не так много. В большинстве устройств это либо датчик отпечатков пальцев, либо сканер лица. Последний обычно устанавливается многими производителями недобросовестно, которые используют для реализации только камеру смартфона, а значит, ваша безопасность снова находится под угрозой. Часто пользователи сталкиваются с тем, что сканер перестает работать. Сегодня предлагаю разобраться в самых популярных причинах и обсудить способы их решения.
На андроид 11 это уже сделали системно. Можно выбрать устройство для воспроизведения.
Недавно Google выпустила первую публичную бета-версию Android 11. Помимо различных функций и изменений, новая версия также позволяет быстро переключаться между различными устройствами воспроизведения звука. Итак, если у вас есть телефон с общедоступной бета-версией, вот как быстро переключить аудиовыход в Android 11.
Быстрое переключение аудиовыхода в Android 11
Подобно Android Q, Android 11 получает возможность переключать вывод звука или видео на динамик телефона, наушники, динамики Bluetooth или другие устройства. Итак, если вам нужно сменить устройство воспроизведения, вам больше не нужно отключать его снова и снова.
Элементы управления мультимедиа перемещены в раздел быстрых настроек на панели уведомлений. Он имеет небольшую кнопку, которая появляется и позволяет вам выбрать, хотите ли вы, чтобы звук воспроизводился через динамик вашего телефона или подключенное устройство Bluetooth.
Однако, он не включен по умолчанию и требует от вас внести некоторые изменения в настройки вашего телефона.
Включить новые элементы управления мультимедиа в Android 11
Чтобы получить доступ к переключателю мультимедиа Android 11, вам сначала необходимо включить новые элементы управления мультимедиа в настройках разработчика вашего телефона.
1] Направляйтесь к Настройки> О телефоне. Здесь ищите Номер сборки и затем коснитесь его семь раз, пока не увидите уведомление о том, что вы разблокировали параметры разработчика.
2] Теперь идите Система> Дополнительно меню в настройках. Здесь выберите Параметры разработчика и включите его.
Использование переключателя мультимедиа Android 11
1] Во время воспроизведения музыки на телефоне через Bluetooth проведите пальцем вниз, чтобы убрать панель уведомлений. Проведите пальцем вниз еще раз, чтобы развернуть плитку быстрых настроек.
2] Теперь нажмите крошечную кнопку в форме таблетки в уведомлении «Сейчас играет».
Вот и все. Используя эту удобную функцию, вы можете при необходимости быстро переключать аудиовыход между беспроводными наушниками и динамиком телефона.
Заключение
На данный момент новые элементы управления мультимедиа необходимо включить в настройках разработчика. Однако мы ожидаем, что они будут включены по умолчанию в следующих бета-сборках, а также в финальном выпуске. В любом случае, что вы думаете об этом? Вы находите его лучше, чем на Android 10? Дайте нам знать в комментариях ниже. Следите за новостями, чтобы увидеть больше таких статей.
Также прочтите- Как использовать встроенный экранный диктофон в Android 11
О том, что стоящий в твоей комнате традиционный телефон с аккуратно лежащей на нем трубкой все равно может за тобой шпионить, известно чуть ли не со времен А. Г. Белла. Смартфоны продвинулись по этой скользкой дорожке значительно дальше. А как все это выглядит с программной точки зрения?
В этой статье мы рассмотрим программу, установленную на телефоне с операционной системой Android, которая без палева передает данные на сервер, установленный на персональном компьютере. Для решения поставленной задачи нам потребуется несколько вещей. В первую очередь это желание, а затем такие мелочи, как телефон (с операционной системой Android), компьютер и интернет. Начнем с разработки алгоритма взаимодействия клиента и сервера.
Исключительно в образовательных целях!
Автор и редакция напоминают, что вся представленная в статье информация опубликована исключительно в образовательных целях. В конце концов, запись аудио и передача его на сайт – задача не редкая, нужная и монетизируемая в самых обычных приложениях. Не нарушай закон!
Все операции обмена данными между клиентом и сервером будут происходить по протоколу TCP/IP. В связи с тем что все взаимодействия представляют собой пересылку последовательности байт от клиента к серверу или наоборот, необходимо разработать формат отправляемых пакетов данных. Кроме непосредственно данных, будем также передавать дополнительную информацию, а именно размер пакета и идентификатор команды.
Ниже описана разработанная система команд между клиентом и сервером. Все команды передаются побайтово в следующем формате:
- 0 — успешно выполнено;
- -1 — произошла ошибка;
- 1 — подключение клиента;
- 2 — начало записи;
- 3 — отправка записанного AAC-файла;
- 4 — отправка записанного WAV-файла;
- 5 — потоковая передача данных;
- 6 — потоковая передача WAV-заголовка.
Для начала давай зададимся вопросом, а что должен делать клиент. В нашем случае необходимо, чтобы телефон записывал звук в фоновом режиме, после чего незаметно для пользователя отправлял файл со звуком на сервер. Причем начинать запись телефон будет только с того момента, как пользователь нажмет кнопку записи, а общее время записи задает сам пользователь в настройках программы. Итак, задача поставлена, необходимо найти ее решение. На борту нашего клиент-телефона установлена операционная система Android. Из этого очевиден выбор языка программирования — им становится Java.
Для написания клиента установим на персональный компьютер IDE Eclipse и Android SDK. Для работы данных компонентов необходим установленный комплект разработчика приложений Java Develovoper Kit. После настройки всех необходимых компонентов подключаем к компьютеру телефон (не забываем про ОС Android) с включенной возможностью отладки по USB. Теперь ты готов кодить! Создай проект в Eclipse и начинай писать программу. Написать класс для подключения к серверу труда не составит. Основные поля этого класса: Socket (программный интерфейс для обеспечения обмена данными между клиентом и сервером.), IP (адрес для подключения), Port (параметр протоколов TCP и UDP) , поток для приема данных, поток для передачи данных. Следуя принципам объектно-ориентированного программирования, все поля делаем приватными (private). В этом классе реализуем метод sendPacket() и задаем его тип synchronized. Synchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени, а данные, измененные одним потоком, будут видны всем другим потокам. В методе sendPacket() при отправке данных создаем блок обработки исключений. Если возникает исключение, информацию о нем записываем в лог и закрываем сокет.
GUI мобильного приложения
Но на этом не стоит останавливаться, потребуется класс для записи данных (звука) (WavRecorder). Для этого класса необходимо описать:
- количество бит на семпл (описываем в виде константы RECORDER_BPP = 16);
- количество каналов записи (CHANNELINMONO);
- формат записи (ENCODINGPCM16BIT);
- флаг, показывающий, идет ли в данный момент запись (по умолчанию false);
- идентификатор устройства;
- IP-адрес сервера;
- номер порта на сервере.
Все поля класса также делаем приватными.
Подробный код ты можешь посмотреть в файле WavStreamer.java. Для самого простого клиента этих классов и методов будет достаточно. Создадим экземпляр Socket’a и будем коннектиться к серверу (о котором речь пойдет далее). В случае удачного присоединения к серверу программа ожидает дальнейших указаний пользователя о необходимости записи. Если соединение не установлено, пользователь должен быть проинформирован об этом (в нашем случае ошибкой соединения). Если мы хотим начать запись, то клиент должен сообщить об этом серверу. Клиент отправляет пакет данных, в котором есть некий код. По этому коду наш сервер понимает, что клиент начал запись. Для старта записи звука в программе создается поток WavRecorder. Этот поток записывает звуковые данные с микрофона клиента-телефона. Для дальнейшего открытия записанного файла в аудиопроигрывателе необходимо записать заголовок, который состоит из определенным образом сформированной последовательности данных (байт).
Схема взаимодействия
Данная последовательность представляет собой определенным образом созданный байтовый массив. Подобный массив описывается во многих интернет-источниках, если тебе не хочется искать его на просторах глобальной сети, то можешь посмотреть в исходниках (он расположен в файле WavStreamer.java).
Казалось бы, все должно работать… Но возникает вопрос: почему не работает? Так как мы пользовались функциями интернета и записи аудио, необходимо сообщить виртуальной Java-машине Dalvik о том, что наше приложение пользуется этими системными функциями. Давай заглянем в файл AndroidManifest.xml и добавим в него следующие строчки:
После этого Java-машина предоставит доступ к запрашиваемым системным функциям, описываемым в манифесте.
После добавления некоторых элементов интерфейса наш клиент полностью готов, и можно переходить к написанию сервера.
Qt — кросс-платформенный инструментарий разработки ПО. Он включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML.
Одну из основных особенностей Qt составляет повсеместное применение концепции сигналов и слотов, использующихся для взаимодействия между объектами. По своей сути слот — это метод класса, который вызывается, когда происходит какое-либо событие (сигнал). Это сильно облегчает разработку графических интерфейсов или работу с сетью. Достаточно подписаться на какой-то сигнал, который генерирует сам Qt или один из классов программы, и нужная функция-обработчик будет автоматически вызвана при его наступлении.
Уведомление во время активной записи
Теперь перейдем к описанию структуры сервера. Основным классом сервера является MyServer, который инкапсулирует в себе объект типа QTcpServer, отвечающий за сетевое взаимодействие. MyServer на вход подается номер порта и IP, на котором будет работать QTcpServer. В обязанности данного класса входит управление новыми соединениями и перенаправление подключенных клиентов на другой класс. Для начала запустим QTcpServer, передав ему входные данные, и установим обработчик (слот) на сигнал типа newConnection(). Этот сигнал генерируется объектом класса QTcpServer при появлении нового соединения. В случае успешного запуска сервер переходит в режим сканирования порта. Обработчик новых подключений передает задачу по считыванию поступающих данных на объект типа User.
Класс User при помощи функции getMessage() обрабатывает поступающие данные и вызывает соответствующую функцию для обработки запроса от клиента.
При желании можно добавить различные фичи в этот проект. Один из вариантов дальнейшего развития — это сервер, находящийся не на компьютере пользователя, а где-нибудь в облаке. Кроме «облачного сервера», можно создать учетные данные пользователя — один и тот же человек может совершать запись звука с различных телефонов. Но хранить данные в разных папках ему будет неудобно.
Решить эту проблему способна учетная запись пользователя. При вводе своих данных пользователь сможет добавлять файлы с телефона другого человека в свой каталог. Правда, реализация данных новшеств привносит и новые задачи. При создании системы учетных записей необходимо хранить базу данных клиентов, с их логинами и паролями. Причем эта база данных должна быть хорошо защищена. Ведь никому не хочется, чтобы его файлы были всем доступны :).
В случае с «облачным сервером» возникает проблема доступа к данным, полученным с мобильного устройства. Решить эту проблему можно путем создания специального клиента-администратора, который получает доступ к данным под конкретной учетной записью и только под ней. Защита звуковых данных пользователя прежде всего!
Поставленная нами в начале статьи цель достигнута. Теперь, запустив нашу программу и «случайно» оставив где-нибудь телефон, ты узнаешь о том, что за спиной говорят про тех, кто оставляет свой дорогостоящий смартфон без присмотра :). При этом телефон для всех окружающих находится в спящем режиме, а файлов с записанным звуком на нем не будет.
Читайте также: