Сообщений: 48
Тем: 4
Зарегистрирован: Jan 2012
Репутация:
68
Недавно занялся изучением платформы Android, как полагается, написал HelloWorld, далее пошли более сложные приложения... Казалось, нет предела совершенству, но, не всё так гладно, как хотелось бы. Android API ни в какую не дает доступа к GSM, какими бы путями я туда не пытался проникнуть. Я знаю, что это сделано из соображений безопасности, и что это не баг, это фича. Суть в том, что моему приложению нужно получать входные данные в виде звукового сигнала (с микрофона или гарнитуры), и отправлять их в GSM канал, и наоборот: принимать данные из GSM канала, преобразовывать в звук, и выводить на динамик\наушники. Желательно делать это поверхностно, по возможности даже без root прав. Вмешательство в ядро Android'a - самый крайний случай.
Теперь по порядку, что и как исследовалось:
Для начала, все запуски производились на Sony ericsson Xperia Neo V, с официальной прошивкой 2.3.4, без root'а и всяческих взломов.
Способ 1) Прямой доступ к классам
PHP код: <?php
import com.android.internal.telephony.PhoneFactory;
....
//PhoneFactory.makeDefaultPhones(this);
Phone phone = PhoneFactory.sProxyPhone;
В результате давал:
PHP код: <?php
java.lang.IllegalAccessError: tried to access field com.android.internal.telephony.PhoneFactory.sProxyPhone from class com.example.MyActivity
Получается, что Android на уровне VM блокирует подобные доступы.
Способ 2) Доступ через рефлексию.
Рефлексия не дала ничего интересного, максимум, получилось добраться до ITelephony, который также не дал явных ссылок на потоки ввода\вывода GSM.
PHP код: <?php
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephony = (ITelephony) m.invoke(tm);
Интересно мнение тех, кто с этим сталкивался, подтолкните, куда копать дальше? Может есть уже готовые приложения, которые так или иначе взаимодействуют с GSM данными?
Сообщений: 1,912
Тем: 56
Зарегистрирован: Jan 2009
Репутация:
12,921
пересмотреть код Андроида - ничё не дает? как он работает с GSM
Сообщений: 979
Тем: 33
Зарегистрирован: Jan 2010
Репутация:
5,857
Neiwick, не подскажу решения, но по вашему описанию походит на программу Shazam, попробуйте из нее вытащить то, что вам нужно.
Сообщений: 48
Тем: 4
Зарегистрирован: Jan 2012
Репутация:
68
06-06-2012, 06:18 AM
(Сообщение последний раз редактировалось: 06-06-2012, 08:30 AM Neiwick.)
VISTALL, дает, цепочка прослеживается, проблема в том, что API не дает мне доступ к тем же классам и методам. Из моего приложения.
Sharki, shazam, насколько помню, ищет музыкальные треки по отрывкам песни, через интернет. Это немного не то, необходимо достучаться до gsm канала.
Сообщений: 979
Тем: 33
Зарегистрирован: Jan 2010
Репутация:
5,857
Neiwick, ну тогда попробуйте покопать программу записи разговора в MIUI прошивках(если надо, поделюсь) там она хорошо работает(есть на маркете еще ряд таких программ, но у каждой свои минусы)
Сообщений: 245
Тем: 6
Зарегистрирован: Apr 2012
Репутация:
1,738
Кхм-кхм...
Вообще-то, у всех официальных прошивок обычно заблокирован доступ к GSM-у (голосу). Полностью. Для того, чтобы оно работало, нужен рут и специальный модуль ядра.
На альтернативных прошивках оно обычно стоит.
Сообщений: 48
Тем: 4
Зарегистрирован: Jan 2012
Репутация:
68
Sharki, я разбирал CallRecorder, для нормальной записи голоса действительно нужна модифицированная прошивка, но запись разговоров, это немного не то. Оно работает по следующему принципу:
Открыть спойлер
Call Recorder
Мне нужно сделать что то типо этого:
Открыть спойлер
Way 1
Evengard, доступ действительно заблокирован для обычных приложений. Но есть и системные приложения, типа стандартного приложения звонков, которое по умолчанию запущено под Root'ом. Оно имеет доступ к GSM'у.
Смотрите, как расставлены приоритеты(в порядке убывания):
1) Обычное приложение, установил, и звонишь.
2) Приложение, которому необходимы права Root
3) Внесение изменений в ядро.
Первые два пункта можно совместить, т.е. попытаться сделать так, чтоб моё приложение было по своим правам как системное (устанавливалось в system/app). Третьим заниматься не охото, так как мне нужен максимально простой для конечного пользователя вариант.
Сообщений: 979
Тем: 33
Зарегистрирован: Jan 2010
Репутация:
5,857
хм, а почему бы тогда не взять любую звонилку? например ex Dialer. Он рута не требует, но и звонит без проблем. Может из нее сможете почерпнуть информации.
Сообщений: 245
Тем: 6
Зарегистрирован: Apr 2012
Репутация:
1,738
ЗВОНИТЬ и ПРОСЛУШИВАТЬ КАНАЛ - разные вещи. Для НАБОРА НОМЕРА - то, чем занимаются все "Звонилки", рут не нужен - это стандартная функция API, при наличии нужного разрешения она сработает на любом номере. Вот только ПРОСЛУШИВАТЬ это АПИ не даёт.
Та же стандартная звонилка работает на уровне обычных приложений (не под Рутом) а просто дёргает все эти АПИ. Дал "пинок" на звонок - всё, на этом задача звонилки завершается, дальше сигнал передаётся в VM, VM передаёт нативным частям мобилки, которые уже запущены под рутом, те в свою очередь стучатся к дровам. Но VM за это уже не отвечает.
Сообщений: 48
Тем: 4
Зарегистрирован: Jan 2012
Репутация:
68
Нашел два решения, оба достаточно не практичные в плане установки, зато позволяют выполнить задуманное. Если кому-то будет интересно, могу поделиться.
|