-
Постов
163 -
Зарегистрирован
-
Посещение
-
Победитель дней
19
Активность репутации
-
mazayhin получил реакцию от Bob32 в Ориентация на Север и углы наклона телефона
После получения матрицы, определяете поворот устройства через IFMXScreenService.GetScreenOrientation к примеру, или опять же, напрямую через api.
Получаете углы (var x, y: integer; OutMatrix: TJavaArray<single>(16)):
0: ничего не делаем, в т.ч. ремап
90: X := TJSensorManager.JavaClass.AXIS_Y; Y := TJSensorManager.JavaClass.AXIS_MINUS_X;
180: X := TJSensorManager.JavaClass.AXIS_X; Y := TJSensorManager.JavaClass.AXIS_MINUS_Y;
270: X := TJSensorManager.JavaClass.AXIS_MINUS_Y; Y := TJSensorManager.JavaClass.AXIS_X;
TJSensorManager.JavaClass.remapCoordinateSystem(FMatrix(изначальная матрица), x, y, OutMatrix)
TJSensorManager.JavaClass.getOrientation(OutMatrix, FOrientation)
-
mazayhin получил реакцию от Barbanel в Ориентация на Север и углы наклона телефона
После получения матрицы, определяете поворот устройства через IFMXScreenService.GetScreenOrientation к примеру, или опять же, напрямую через api.
Получаете углы (var x, y: integer; OutMatrix: TJavaArray<single>(16)):
0: ничего не делаем, в т.ч. ремап
90: X := TJSensorManager.JavaClass.AXIS_Y; Y := TJSensorManager.JavaClass.AXIS_MINUS_X;
180: X := TJSensorManager.JavaClass.AXIS_X; Y := TJSensorManager.JavaClass.AXIS_MINUS_Y;
270: X := TJSensorManager.JavaClass.AXIS_MINUS_Y; Y := TJSensorManager.JavaClass.AXIS_X;
TJSensorManager.JavaClass.remapCoordinateSystem(FMatrix(изначальная матрица), x, y, OutMatrix)
TJSensorManager.JavaClass.getOrientation(OutMatrix, FOrientation)
-
mazayhin получил реакцию от Barbanel в Ориентация на Север и углы наклона телефона
Да, все верно, именно об этом и писал.
-
mazayhin получил реакцию от Barbanel в Ориентация на Север и углы наклона телефона
Все на скорую руку. Никаких проверок не делал. Вообще, за основу брал статью с хабра https://habr.com/ru/post/137820/
Так же учтите, что необходимо проверить наличие магнитного датчика, т.к. без него getRotationMatrix всегда будет возвращать false, т.о. не получится определить положение устройства. Так же, еще, getOrientation вернет неправильные значения при повороте телефона, для этого надо определять текущую ориентацию экрана, и на основании этого делать remapCoordinateSystem, и только после этого уже определять положение.
Смотрите, принцип понятен.
Обертки взял от FMXExpress, немного подчистил, что бы не тянуть лишнего.
Если будете брать сами, то обратите внимание:
android.hardware.SensorManager:
надо изменить JavaSignature на [JavaSignature('android/hardware/SensorManager')] для интерфейса JSensorManager (убрать $ и что после него, иначе, EJNIFatal)
android.hardware.SensorEventListener:
неправильно унаследованы интерфейсы (от JObject), а так как SensorEventListener это интерфейс, наследуемся от IJavaClass и IJavaInstance соответственно.
SensorManager.zip
-
mazayhin получил реакцию от Anatoliy в Serial port
Но все же, думаю лучше, скомпилировать JAR и к нему уже делать обертку. Т.к. в противном случае, придется с собой очень много чего тащить в проект (java.*, javax.* и прочие, смотрите, сколько там зависимостей), что можно сказать, равнозначно почти собирать в студии половину android-api
-
mazayhin получил реакцию от MrAnderson в Перестало работать приложение. Splash screen и дальше падает.
Потому что API-Level 26 он будет стоять автоматически. Как впрочем и практически все остальные, запрошенные в манифесте. Так же, не плохо было бы добавить в манифест
<uses-feature android:name="android.hardware.camera" /> Начиная с 26 необходимо разрешения, помимо указания в манифесте, должны явно запрашиваться у пользователя.
Почитайте https://developer.android.com/guide/topics/permissions/overview
Ну а для Delphi подключайте KastiFree https://github.com/DelphiWorlds/KastriFree
Там есть пример использования https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidDangerousPermissions
и в добавок https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidAPI26 тут как раз работа с камерой
-
mazayhin получил реакцию от Anatoliy в Serial port
Можно создать обертку для java-классов, которые есть в исходниках Android с помощью Java2OP, или же руками, посмотрев как раз исходники.
Исходники %sdk_path%\sources\android-nn\android\hardware\usb
android-nn - версия API
И уже эти файлы подключать.
Либо взять готовые от FMXExpress
-
mazayhin получил реакцию от Anatoliy в Перестало работать приложение. Splash screen и дальше падает.
Потому что API-Level 26 он будет стоять автоматически. Как впрочем и практически все остальные, запрошенные в манифесте. Так же, не плохо было бы добавить в манифест
<uses-feature android:name="android.hardware.camera" /> Начиная с 26 необходимо разрешения, помимо указания в манифесте, должны явно запрашиваться у пользователя.
Почитайте https://developer.android.com/guide/topics/permissions/overview
Ну а для Delphi подключайте KastiFree https://github.com/DelphiWorlds/KastriFree
Там есть пример использования https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidDangerousPermissions
и в добавок https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidAPI26 тут как раз работа с камерой
-
mazayhin получил реакцию от Barbanel в Перестало работать приложение. Splash screen и дальше падает.
Потому что API-Level 26 он будет стоять автоматически. Как впрочем и практически все остальные, запрошенные в манифесте. Так же, не плохо было бы добавить в манифест
<uses-feature android:name="android.hardware.camera" /> Начиная с 26 необходимо разрешения, помимо указания в манифесте, должны явно запрашиваться у пользователя.
Почитайте https://developer.android.com/guide/topics/permissions/overview
Ну а для Delphi подключайте KastiFree https://github.com/DelphiWorlds/KastriFree
Там есть пример использования https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidDangerousPermissions
и в добавок https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidAPI26 тут как раз работа с камерой
-
mazayhin получил реакцию от unlimuser в XE8, не могу установить соединение с базой Sqlite на устройстве под Android
Ну скорее всего у себя вы указали в коннекшене символическое имя для подключения, оно сохраняется в FDConnectionDefs.ini (вроде правильно), а у пользователя его нет.
Задайте параметры подключения вручную, явно
-
mazayhin получил реакцию от Anatoliy в XE8, не могу установить соединение с базой Sqlite на устройстве под Android
Ну скорее всего у себя вы указали в коннекшене символическое имя для подключения, оно сохраняется в FDConnectionDefs.ini (вроде правильно), а у пользователя его нет.
Задайте параметры подключения вручную, явно
-
mazayhin отреагировална Равиль Зарипов (ZuBy) в Мобильное приложение для курьера
У меня в гите есть набор компонентов, там есть гамбургер, кнопка назад и FAB кнопка.
смотрите демки
-
mazayhin получил реакцию от ivyl в Обновление приложения
Сколько уже разжевывали, что не заменяются ресурсы из деплоя..
-
mazayhin получил реакцию от x11 в Окно на переднем плане во время звонка
Как создавать это вью или как им созданным пользоваться?
Если создавать - то создаете разметку в xml, деплоете ее в layouts. Примеров в интернете можно кучу найти. Остальное - в другие папки.
В общем, получится во так.
Здесь задеплоено 3 файла - картинка res/drawable/myicon.png, res/drawable/border.xml - прямоугольник подложки и res/layouts/toast.xml - сам lauoyt.
toast.xml ("-- " - комментарии, удалить надо будет).
Текст, картинки и прочее можем сразу указать в разметке, и грузить автоматически. Но всегда сможем поменять в коде
border.xml
Думаю, тут все понятно. Примитив может быть любой.
И формируем тост:
//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.
А что не понятно, яндекс показывает, глаза разбегаются.
-
mazayhin получил реакцию от Andrey Efimov в Log.d - что это?
API for sending log output.
Generally, you should use the Log.v(), Log.d(),Log.i(), Log.w(), and Log.e() methods to write logs. You can then view the logs in logcat.
The order in terms of verbosity, from least to most is ERROR, WARN, INFO, DEBUG, VERBOSE. Verbose should never be compiled into an application except during development. Debug logs are compiled in but stripped at runtime. Error, warning and info logs are always kept.
Смотреть это можно через monitor.bat идет в составе sdk, ну или abd logcat. В лог выод идет только для debug сборок, в release не выводится
-
mazayhin получил реакцию от Andrey Efimov в SSDP for Android
Как вижу, тут есть 3 варианта.
1. Взять обертки над SDK от fmxexpress (или сделать самому), и самому написать по примеру выше, но уже на delphi.
2. Найти подходящее на Java, скомпилировать в jar, создать обертку для delphi (Java2Op) и использовать уже ее.
3. Наверное, самый удачный вариант, т.к. все это чудо работает по UDP, самому на основе Indy реализовать в своей программе.
-
mazayhin получил реакцию от AngryOwl в Программно развернуть свернутое приложение
Вот здесь, когда оборачиваете в PendingIntent, присваиваете ему уникальный номер (в примере выше это 1), этот номер где-то храните.
PendingIntent := TJPendingIntent.JavaClass.getBroadcast (TAndroidHelper.Context, _ТУТ НОМЕР_, intent, 0); Потом, что бы отменить, создаете идентичный PendingIntent, с номером, с которым запускали, и
TAndroidHelper.AlarmManager.cancel(PendingIntent);
-
mazayhin получил реакцию от ENERGY в Программно развернуть свернутое приложение
Вот здесь, когда оборачиваете в PendingIntent, присваиваете ему уникальный номер (в примере выше это 1), этот номер где-то храните.
PendingIntent := TJPendingIntent.JavaClass.getBroadcast (TAndroidHelper.Context, _ТУТ НОМЕР_, intent, 0); Потом, что бы отменить, создаете идентичный PendingIntent, с номером, с которым запускали, и
TAndroidHelper.AlarmManager.cancel(PendingIntent);
-
mazayhin получил реакцию от Ingalime в Программно развернуть свернутое приложение
Вот здесь, когда оборачиваете в PendingIntent, присваиваете ему уникальный номер (в примере выше это 1), этот номер где-то храните.
PendingIntent := TJPendingIntent.JavaClass.getBroadcast (TAndroidHelper.Context, _ТУТ НОМЕР_, intent, 0); Потом, что бы отменить, создаете идентичный PendingIntent, с номером, с которым запускали, и
TAndroidHelper.AlarmManager.cancel(PendingIntent);
-
mazayhin получил реакцию от Dev в Программно развернуть свернутое приложение
Вот здесь, когда оборачиваете в PendingIntent, присваиваете ему уникальный номер (в примере выше это 1), этот номер где-то храните.
PendingIntent := TJPendingIntent.JavaClass.getBroadcast (TAndroidHelper.Context, _ТУТ НОМЕР_, intent, 0); Потом, что бы отменить, создаете идентичный PendingIntent, с номером, с которым запускали, и
TAndroidHelper.AlarmManager.cancel(PendingIntent);
-
mazayhin отреагировална FREEFAR в Приложение для получения раздражителей в работе Магазинов розничной сети
Продолжая выражать благодарность всем тем кто помогал решать задачи которые перед нами ставили с удовольствием предлагаю вашему вниманию собственно само приложение. На Андроид доступно пока попрямой ссылке https://play.google.com/store/apps/details?id=com.wb.PulsM
На iOS ушли в аудит Apple
-
mazayhin отреагировална Savage в Изменение стандартного звука а push-уведомлении
Задачу решил.
Вот измененная процедура, ну и добавил вытягивание параметра sound
private Builder buildNotification(String msgTitle, String msgText, String msgSound, PendingIntent contentIntent) {
int icon = this.mContext.getApplicationContext().getApplicationInfo().icon;
Builder mBuilder = new Builder(this.mContext);
mBuilder.setSmallIcon(icon);
mBuilder.setTicker(msgTitle);
mBuilder.setContentTitle(msgTitle);
mBuilder.setContentText(msgText);
mBuilder.setContentIntent(contentIntent);
// savage
if (msgSound == "") {
mBuilder.setSound(RingtoneManager.getDefaultUri(2));
}
else
{
mBuilder.setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/"+msgSound));
}
//
return mBuilder;
}
Звуковой файл надо добавить в Deployment
Расположение res/raw/
При формировании push-сообщения имя файла указывается без расширения. К примеру, если звуковой файл был event1.mp3, то в пуше посылаем "sound":"event1"
Во вложении патченый файл.
Сборка fmx.jar и classes.dex как в этой теме
NotificationPublisher.zip
-
mazayhin получил реакцию от Dev в SSDP for Android
Как вижу, тут есть 3 варианта.
1. Взять обертки над SDK от fmxexpress (или сделать самому), и самому написать по примеру выше, но уже на delphi.
2. Найти подходящее на Java, скомпилировать в jar, создать обертку для delphi (Java2Op) и использовать уже ее.
3. Наверное, самый удачный вариант, т.к. все это чудо работает по UDP, самому на основе Indy реализовать в своей программе.
-
mazayhin получил реакцию от DMS в Log.d - что это?
API for sending log output.
Generally, you should use the Log.v(), Log.d(),Log.i(), Log.w(), and Log.e() methods to write logs. You can then view the logs in logcat.
The order in terms of verbosity, from least to most is ERROR, WARN, INFO, DEBUG, VERBOSE. Verbose should never be compiled into an application except during development. Debug logs are compiled in but stripped at runtime. Error, warning and info logs are always kept.
Смотреть это можно через monitor.bat идет в составе sdk, ну или abd logcat. В лог выод идет только для debug сборок, в release не выводится
-
mazayhin получил реакцию от Barbanel в REST Client Library vs. THTTPClient
THTTPClient - голый клиент, а в TREST... За вас сделана часть работы для работы по rest, и ну и преобразования результата в TDataSet. Внутри там тот же HttpClient