Ние пишем нашия Dialer за Android и работим с повиквания на ниско ниво

android

Съдържанието на статията

В изданието по случай 200-годишнината на хакера разгледахме скритите и не толкова страхотни аспекти на работата с SMS. Днес продължаваме темата, като обръщаме внимание на гласовите повиквания.

пишем
Типичен черен списък

Xakep #241. Хакване на игри

Къде са му копчетата?

Както можете да видите, използвахме метода hasSystemFeature от обекта PackageManager, предавайки константата FEATURE_TELEPHONY като параметър. Освен това има смисъл допълнително да проверите поддръжката на GSM модула чрез константата FEATURE_TELEPHONY_GSM.

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

Приемаме първото обаждане

Когато влезе повикване, целочисленият параметър на състоянието е зададен на CALL_STATE_RINGING, което кара нашия боен (или мирен) полезен товар да бъде извикан под формата на функцията doMagicWork.

работим
Входящо повикване

Получаваме второ обаждане

Намерения е рамка за междупрограмни съобщения. Намеренията се използват широко в Android за стартиране/спиране на дейности и услуги, излъчване на съобщения в цялата система, имплицитно извикване на дейности, услуги и приемници за излъчване.

Приемниците за излъчване са компоненти, които приложението може да използва за проследяване на намерения и отговор на всички получени действия. Приемниците реализират събитиен модел на взаимодействие между приложенията и системата. Темата за създаване на приемник за излъчване е разгледана по-подробно в статията „Хакване на Cron на Android“.

Както в предишния случай, приложението трябва да получи разрешението READ_PHONE_STATE в манифеста:

Излъчването също е регистрирано там.приемник, способен да проследява намерение за излъчване:

С този подход винаги можем да получаваме информация за входящи обаждания, дори ако приложението не работи в момента.

Този подход трябва да се използва на практика.

Затварям!

Като алтернатива можете да опитате да използвате езика за дефиниране на интерфейса на Android (AIDL), за да осигурите комуникация между процесите между системните компоненти.

За да направите това, трябва да добавите интерфейсния файл ITelephony.aidl към проекта със следната форма:

Следният код ще вземе интерфейса и ще затвори чрез отражение:

За да работи тази икономика, приложението трябва да получи още едно разрешение в манифеста:

Поради това няма да работи на устройства с Android 2.3 и по-нова версия, тъй като от Gingerbread това разрешение се счита за системно и опитът да се използва ще доведе до срив на приложението:

Приложенията от втората група се опитват да прекратят разговора по нетривиални начини - например, като се преструват на потребител и натискат бутони:

Оригинален, но доста работещ метод може да бъде намаляването на силата на звука на нежелано повикване до нула:

Използвайки обекта AudioManager, първо получаваме текущия звуков профил getRingerMode() и след това задаваме безшумен режим на AudioManager.RINGER_MODE_SILENT.

След спиране на повикването (текущото състояние се променя на EXTRA_STATE_IDLE), възстановяваме оригиналния режим:

Но дори и в този случай не можете да правите без специални разрешения:

Тук не блокираме номера като такъв, а просто не вдигаме телефона, но този подход не изисква никакви "трикове".

Има приложения, които с различна степен на успех се опитват да получатдостъп до бутони на екрана за входящо повикване, като например тук.

Както показва практиката, много „хакове“, които работят добре на някои устройства, в най-добрия случай не работят на други, а в най-лошия случай сриват приложението по време на входящо повикване. Съответно оценките на такива приложения скачат от едно („Нищо не работи, върнете парите!“) До пет („Използвам го от двадесет години, всичко ми подхожда!“).

повиквания
Работи ли или не?

Върху това може да се постави точка, ако внезапно "корпорацията на доброто" не направи ход с епископ.

Лепкав списък на Google

За повече информация относно приложенията по подразбиране вижте тази статия.

Работата с BlockedNumberContract е подобна на взаимодействието с база данни: използват се разпознаваемите методи за вмъкване, изтриване и, разбира се, извличане на записи.

Доставчик на съдържание е споделено постоянно хранилище (обикновено SQLite база данни), което съдържа и управлява специфична за приложението информация. Предпочитаният начин за обмен на данни между различни програми.

Премахването на номер от забрана е също толкова лесно:

За да проверите дали даден номер е в черния списък, е предоставен методът isBlocked(Context, String).

И накрая, за да получите всички отхвърлени с един замах:

Така триковете, обсъдени в предишния раздел, постепенно ще отпаднат. Друг е въпросът колко бързо ще стане това. Делът на Android 7 все още не надвишава дори инженерна грешка.

обадете се обратно

Има два фундаментално различни начина за извършване на разговор в Android. Първият и най-лесният е да извикате стандартната дейност, като й предадете номера, който да зададете като параметър:

dialer
Стандартен дайлер

Стандартна дейност за набираневи позволява да промените номера точно преди да направите повикване, така че не са необходими разрешения в манифеста на приложението.

Втората опция е да прихванете намерения, обслужвани от стандартно приложение, и да извикате вашата дейност. В този случай рисуването на екранни цифрови бутони и търсенето на контакти (и това в никакъв случай не е пълен списък) пада върху раменете на програмиста.

Освен това, тъй като в този случай е необходимо разрешение:

започвайки с Android 4.4, приложението ще откаже да работи, ако не е избрано по подразбиране, и е малко вероятно потребителят просто да промени познатия „набирач“.

Ода на манифеста

Ако внимателно прочетете раздела „Кодиране“, вероятно сте забелязали, че едно или друго потенциално опасно действие в Android изисква недвусмислено разрешение. Въпреки съществуващите уязвимости (кога за последен път сте пристигнали корекции?) в различни компоненти на системата, като цяло самият потребител се оказва основното огнище на проблеми. Разбира се, ако представлявате интерес за ЦРУ, никаква забрана за разрешение за приложение няма да ви спаси, но в обикновения живот трябва да сте изключително предпазливи към целия инсталиран софтуер, дори ако идва от Google Play. Какво мислите, струва ли си да си поставите калкулатор, ако изисква достъп до интернет и възможност за изпращане на SMS?

Заключение