Перейти к содержанию
Fire Monkey от А до Я
  • 0

Окно на переднем плане во время звонка


x11

Вопрос

Во время звонка в службе есть BroadCast receiver, который обрабатывает входящие и исходящие звонки. Определяет номер. Тут вроде бы уже есть более менее стабильный код.

Но пользователю во время звонка нужно показать какое-нибудь заметное, но небольшое окно с картинкой и текстом, чуть больше, чем toast. Окно, которое будет висеть некоторое время впереди перед звонилкой.

Сейчас реализовано так, что служба показывает Toast, но этого недостаточно, т.к. это маленькое текстовое и краткосрочное сообщение. Пока пользователь достанет смартфон из кармана, потом из чехла или пока откроет переднюю крышку чехла, toast пропадает.

Нужно что-то типа Toast. Но чтобы висело секунд 10-15.

Как вариант, можно было бы показывать Notification, но и здесь Андроид и Firemonkey добавляют свои ограничения: вверху, в строке статуса отображается только значок и только главный значок приложения.

Попытался менять главную иконку у приложения перед показом Notification http://fire-monkey.ru/topic/682-tnotificationcenter-можно-ли-изменить-иконку/?do=findComment&comment=30366

но всё равно отображается стандартная.

Да и текста нет :(, нельзя в статус баре показать свой текст, даже временно.

Если будут примеры, буду весьма признателен.

 

Изменено пользователем x11
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

на счёт уведомления:

Берем файл System.Notification.Android, находим CreateNativeNotification (или как-то так, уже не помню) и правим как вам нужно.

Я делал через xml разметку, по этой статье. Там все просто. При том что у меня все это было в сервисе

Ссылка на комментарий
  • 0

Не хочет человек этого делать. Хочет костылями и извращениями получить то, что напрямую не выйдет.

х11, кстати, может просто свое приложение как звонилку по-умолчанию сделать? 

Ссылка на комментарий
  • 0

Я узнал, что можно сделать Toast со своей собственной вёрсткой. Так сделано у знакомого андроид-разработчика. Он сделал окно побольше, добавил картинку (drawer). Поднял повыше.

И вот что я обнаружил у китайского автора в "Androidapi.JNI.ToastForService" в FlyUtils (https://forums.embarcadero.com/thread.jspa?threadID=118465).

 

    procedure setDuration(value: Integer); cdecl;
    procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;
    procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;
    procedure setText(s: JCharSequence); cdecl;
    procedure setView(view: JView); cdecl;

Тут есть и Gravity, и Margin, и View.

Т.к. описания и документации нет, и примеров нет для ToastForService, то может кто-то уже знает, что такое JView и это как использовать в FMX?

Ссылка на комментарий
  • 0

JView это и есть вью, которое вы хотите показать. Делаете ее в xml и из ресурсов грузите.

А так да, я понял что вы хотите. Только работать будет не у всех. Постараюсь если на выходных на работе появиться сделать демку, ну или уже в будни

Ссылка на комментарий
  • 0
13 минуты назад, mazayhin сказал:

Делаете ее в xml и из ресурсов грузите.

Вот это как раз и не знаю, как сделать.

Как должен выглядеть XML?

Ну допустим, сделал я XML, а дальше?

Ссылка на комментарий
  • 0

 

PToast.setGravity(50, 0, 0);

как вместо 50 указать что-то вроде Gravity.CENTER?

как перевести этот код в Delphi:

customtoast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);

 

Изменено пользователем x11
Ссылка на комментарий
  • 0

Вот так будет по центру

PToast.setGravity(1, 0, 0);

Нужно передавать константы, а не значения в единицах.

Изменено пользователем x11
Ссылка на комментарий
  • 0

Набросал.

Вариант с отрисовкой системного окна не стал делать

Такое без изменения исходников не получится. Ну и так же без использования апи.

Сервис с выводом уведомления при звонке будет не совсем корректно отрабатывать на 6 и выше

https://yadi.sk/d/vVFOnbBZ3SpMDN

Изменено пользователем mazayhin
Ссылка на комментарий
  • 0

Как создавать это вью или как им созданным пользоваться?

Если создавать - то создаете разметку в xml, деплоете ее в layouts. Примеров в интернете можно кучу найти. Остальное - в другие папки.

В общем, получится во так.

Здесь задеплоено 3 файла - картинка res/drawable/myicon.png, res/drawable/border.xml - прямоугольник подложки и res/layouts/toast.xml - сам lauoyt.

toast.xml ("-- " - комментарии, удалить надо будет).

  Показать содержимое

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="200dp"
				android:layout_height="wrap_content"
				android:orientation="horizontal"
				android:padding="10dp"
				android:layout_gravity="center_horizontal"
				android:background="@drawable/border"> -- где ищем подложку
	<ImageView
				android:id="@+id/toastImage" -- название элемента, уникальное
                android:src="@drawable/myicon" -- можем сразу грузить с ресурсов
                android:padding="4dp"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_marginLeft="8dp"
                android:layout_marginRight="8dp"
                android:layout_gravity="center_vertical"
                android:contentDescription="ToastPicture" />
<TextView
                android:id="@+id/toastText" -- так же название
                android:layout_width="match_parent"
                android:maxWidth="200dp"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:text="Моя информация"
                android:textColor="#D50000"
                android:textSize="30sp"
                android:layout_gravity="center_vertical"/>
</LinearLayout>

 

Текст, картинки и прочее можем сразу указать в разметке, и грузить автоматически. Но всегда сможем поменять в коде

border.xml

  Показать содержимое

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <padding android:left="8dp" android:top="8dp"
            android:right="8dp" android:bottom="8dp" />
    <corners android:radius="10dp" />
	<stroke
        android:width="2dip"
        android:color="#000000" />
    <solid android:color="#FFFFFF"/>
</shape>

 

Думаю, тут все понятно. Примитив может быть любой.

И формируем тост:

//uses FMX.Helpers.Android, AndroidApi.Helpers, AndroidApi.JNI.GraphicsContentViewText, Androidapi.JNI.Widget
var
  Toast: JToast;
  InfObj: JObject;
  Inflater: JLayoutInflater;
  View: JView;
  Text: JTextView;
begin
  InfObj := TAndroidHelper.Context.getSystemService
    (TJContext.JavaClass.LAYOUT_INFLATER_SERVICE);
  Inflater := TJLayoutInflater.Wrap((InfObj as ILocalObject).GetObjectID);
  View := TJView.JavaClass.init(TAndroidHelper.Context);
  View := Inflater.inflate(TAndroidHelper.Context.getResources()
    .getIdentifier(StringToJString('layout/toast'), StringToJString('layout'),
    TAndroidHelper.Context.getPackageName), nil); //Грузим из ресурсов. Второе значение всегда nil
  Text := TJTextView.Wrap
    ((View.findViewById(TAndroidHelper.Context.getResources()
    .getIdentifier(StringToJString('id/toastText'), StringToJString('id'),
    TAndroidHelper.Context.getPackageName)) as ILocalObject).GetObjectID); // Так ищем элементы разметки, если надо свои значения поставить. Так же могли и поменять картинку(id/toastImage), подложку и т.д.
  Text.setText(StrToJCharSequence('Привет, х11! Я нативный Toast!' + #13 +
    'Сегодня пишем на Pascal')); //Устанавливаем свое значение. 
  CallInUIThreadAndWaitFinishing( //В сервисе запускаем без этого, отключаем FMX.Helpers.Android - только его, GraphicsContentViewText к графике, которая ломает сервис, отношения не имеет.
    procedure
    begin
      Toast := TJToast.JavaClass.init(TAndroidHelper.Context);
      Toast.setView(View); // Своя вьюшка
      Toast.setDuration(TJToast.JavaClass.LENGTH_LONG); //Константа. Свое значение не пройдет
      Toast.Show; //Показываем
    end);
end;

Ну и все в принципе.

Сложного, считаю, 0.

А что не понятно, яндекс показывает, глаза разбегаются.

 

device-2018-02-27-181921.png

Изменено пользователем mazayhin
вычистил
Ссылка на комментарий
  • 0
В 27.02.2018 в 13:48, mazayhin сказал:

Toast.setDuration(TJToast.JavaClass.LENGTH_LONG); //Константа. Свое значение не пройдет

К сожалению, Тоаст висит не долго. Пока пользователь достанет смарт и/или откроет крышку чехла-книжки, то Тоаст закрывается.

Я добавил показ несколько раз подряд в цикле с паузой. Но на новых версиях Андроида всё равно такой финт не проходит :(

Ссылка на комментарий
  • 0
27 минут назад, x11 сказал:

К сожалению, Тоаст висит не долго. Пока пользователь достанет смарт и/или откроет крышку чехла-книжки, то Тоаст закрывается.

Я добавил показ несколько раз подряд в цикле с паузой. Но на новых версиях Андроида всё равно такой финт не проходит :(

Рисуй свой Toast, Layout, Rectangle и выводи поверх, держи сколько нужно показ!

Ссылка на комментарий
  • 0

На сколько я знаю, то поверх звонилки ничего своего показывать нельзя. Или это очень сложно.

А у Тоаст только 2 значения длительности: короткий и длинный.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...