Дано: есть приложение Ultimate Call Screen HD - аналогичных приложений на маркете довольно много. Вопрос: как это работает? Как написано? У кого какие идеи? P.S. Ориентируемся на нерутованные аппараты.
Ответ
TL;DR
Приложение представляется системе гарнитурой для того, чтобы принимать/завершать звонки У приложения Ultimate Call Screen HD в манифесте указано следущее:
...
Из манифеста видно, что PhoneReceiver получает первым интенты от системы про исходящий/входящий звонок. Далее он делегирует обработку сервисам InCallService и OutcallService, которые отображают необходимый интерфейс для управления и используют AudioManager для передачи голоса UPDATE:
Откроем класс InCallService public class InCallService extends Service implements SensorEventListener, a, b, e {
...
static boolean H;
WindowManager G;
WindowManager.LayoutParams I;
CallWindowView J;
...
private void e(final boolean b) {
if (b) {
return;
}
this.G.addView((View)this.J, (ViewGroup$LayoutParams)this.I);
InCallService.H = true;
} private void f(final boolean b) {
if (!b) {
return;
}
if (this.J.getWindowToken() != null) {
this.G.removeView((View)this.J);
}
InCallService.H = false;
} private void t() {
this.I = new WindowManager.LayoutParams(-1, -1, 2010, 2621600, -1);
if (g.a("hide_status_bar", true)) {
final WindowManager.LayoutParams i = this.I;
i.flags |= 0x100;
}
else {
this.I.type = 2003;
}
this.I.gravity = 80;
if (g.a("force_full_brightness", true)) {
this.I.screenBrightness = 1.0f;
}
(this.J = (CallWindowView)((LayoutInflater)this.getSystemService("layout_inflater")).inflate(2130903099, (ViewGroup)null)).a(new a(this));
this.G = (WindowManager)this.getSystemService("window");
}
...
}
Из этого кода видно, что приложение накрывает стандартное окно звонилки своим CallWindowView (для этого и необходимо разрешение android.permission.SYSTEM_ALERT_WINDOW). Разметка для входящего звонка хранится в R.layout.two_button_frame = 2130903099
...
...
Комментариев нет:
Отправить комментарий