• 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 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

Зачем мне apk?

Если можете, покажите примеры, как работать с JVIEW в данном случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 пользователей онлайн

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