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

Andrey Efimov

Модераторы
  • Постов

    842
  • Зарегистрирован

  • Победитель дней

    123

Весь контент Andrey Efimov

  1. Для начала, обновите студию как минимум на версию XE8, именно с этой версии появилась поддержка Android 5.*. В идеале, обновить до версии Берлин, с апдейтами. Более подробно, по всем версиям, читайте тут
  2. Важно, ещё уточнить, на какой версии Андроида пробуете. Метод введен в API 21, соответственно работать будет на Android 5.0 и выше.
  3. Эм... так если условие совпадения номера не выполняется, то и программа ничего не делает. Как говорится: доверяй, но проверяй. Проверил на архиве, что скинул вам, добавил условие срабатывания вибрации по номеру и всё там нормально обрабатывается, ничего не вылетает. Если номер совпадает - то вибрирует. Если нет, то не вибрирует. Так что ищите ошибку в своём коде...
  4. Ага, только перепроверьте обёртку, очень часто они неправильно сгенерены...
  5. Верно, событие FormSaveState добавлено для сохранения состояния приложения и выполнения операций по остановке выполнения функций. Т.е. в вашем случае, может быть, будет лучше просто остановить выполнение всех функций, а далее, после сворачивания система сама решит когда "прибить" ваше приложение. Application.Terminate уже стабильно работает на Android? (последний раз проверял еще на XE6, там не работало) На данный момент мне известно несколько (рабочих) вариантов закрытия: Close finish (из Android API) killProcess (из Android API) killBackgroundProcesses (из Android API)
  6. Со свежей головой. В дополнение к предыдущим замечаниям. Ну понеслась... Что это такое? BroadcastReceiver.Add('android.intent.action.READ_PHONE_STATE'); Зачем это? var telephonyService: JObject; telephonyManager: JTelephonyManager; ... begin outputResult:= #13#10; telephonyService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID); Где определение статуса? (EXTRA_STATE_RINGING) В общем, я внёс некоторые правки в ваш код и всё работает, но далее только в раздел Ищу подрядчика или ищите того, кто вам бесплатно реализует вашу задачу (сомневаюсь, что такие найдутся). Call2.zip
  7. Исходники - это файлы из корневой папки проекта, без подпапок, в которых собирается проект. Т.е. папка Android не нужна. Далее, по коду. Где у вас это?: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(BroadcastReceiver) then BroadcastReceiver.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin CreateBroadcastReceiver; end; Далее, на вибрацию нужно выставить пермишен "Vibrate" (на днях выложу на свой гитхаб, класс, упрощающий работу с вибрацией) Менять местами код в регистрации ресейвера, смысла нет, делайте так как и было. incomingCallNumber - вообще не понял, что это, где код, в котором вы заносите в эту переменную номер? По поводу глобальных переменных -это уже придирка, но лучше пишите их в классе, как поля. Вот в этом коде: if incomingCallNumber = 'номер телефона' then VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE); Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID); Vibrator.vibrate(10); словите ошибку, возможно AV, если звонок будет просто с другого номера. Пока вроде всё, что бросилось в глаза, но уже ночь и мог что-то не углядеть. Правьте и пробуйте. Ваш архив перезалил, номер потёр. Итог: Плохо копируете код. Мой совет: Если не знаете, что делаете или просто не охото изучить представленные примеры, то лучше обратитесь в раздел Ищу подрядчика. Или можете попробовать помучить ещё форумчан, хотя вам дали примеры с избытком...
  8. Так... Значит пишите так: BroadcastReceiver:= TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive := CheckPhoneCallState; BroadcastReceiver.RegisterReceive; BroadcastReceiver.Add('android.intent.action.PHONE_STATE'); BroadcastReceiver.Add('android.intent.action.READ_PHONE_STATE'); Не сработает, тогда добавляйте такой код в секцию private procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); далее в секцию implementation procedure TForm1.BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); begin CheckPhoneCallState(csContext, csIntent); end; в коде регистрации ресейвера BroadcastReceiver:= TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive; BroadcastReceiver.RegisterReceive; BroadcastReceiver.Add('android.intent.action.PHONE_STATE'); BroadcastReceiver.Add('android.intent.action.READ_PHONE_STATE');
  9. Ну, а что именно подчёркнуто? Если BroadcastReceiverOnReceive то и правильно, метода же нет у вас в классе, впишите свой CheckPhoneCallState или вот гляньте ответ http://stackoverflow.com/questions/33609494/how-to-check-and-hag-up-reject-incoming-outgoing-calls-on-android-in-delphi, там как раз по этому компоненту и очень похоже на ваш код... АП. Кстати, у @Rusland в той теме, тоже метода не хватает...
  10. А с чего у вас будет срабатывать метод CheckPhoneCallState если вы его не зарегистрировали как OnReceive У вас вообще строчка закомментирована //BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive; и ещё, вы используете динамическую регистрацию ресейвера, значит по окончании работы приложения вам нужно разрегистрировать ресейвер. Ну и соответственно, работать динамическая регистрация будет только когда запущено приложение. Если вам необходимо использование только во время работы приложения, то лучше гляньте ссылку, которую дал вам Ярослав, там уже есть событие. Дополнение: А что за компонент вы используете? там при каждом Add перерегистрация происходит? Обычно регистрация в таком порядке происходит: BroadcastReceiver:= TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive; BroadcastReceiver.Add('android.intent.action.PHONE_STATE'); BroadcastReceiver.Add('android.intent.action.READ_PHONE_STATE'); BroadcastReceiver.RegisterReceive; Вопросы снимаются, нашёл реализацию этого компонента на stackoverflow.
  11. На форуме есть раздел Android и поиск (например: Синтез речи (text-to-speech) и ещё Читалка текста. Нет звука (speech.tts)) и android.speech.tts
  12. Зачем вам постоянно висящий в памяти сервис, если он нужен только когда поступил звонок от определённого номера? Вы читали то, что я написал в первом сообщении (особенно про BroadcastReceiver)? Сразу говорю, что готовый код на Delphi/С++, с вероятностью 99% - вы не найдёте, только на Java (на стеке например). Раз у вас проблема именно с определением номера, то значит вы уже подписались на событие звонка и уже сделали сервис(?). Тогда давайте ваш код или покажите, какие данные приходят в сервис, а мы уже попробуем вам помочь. p.s. Я бы сделал так, подписался через BroadcastReceiver на событие, как только событие происходит, проверяю номер и далее уже запускаю сервис, что-то делаю в нём, завершаю работу сервиса. ИЛИ событие происходит, запускаю сервис, в нём проверяю номер и т.д. Тут либо экспериментировать, либо найти готовое решение или описание решения на Java и транслировать на Delphi. Пара ссылок: [Android Service] Создание простейшего Сервиса (службы) [BroadcastReceiver] Автозапуск приложения после перезагрузки ОС [Android Service+BroadcastReceiver] Автозапуск службы после рестарта ОС
  13. Не знаю, не пробовал. Была задача: хранить на устройстве в зашифрованном виде пароль, а потом при обращении к сайту по https (Post методом) он передавался открыто (тут уж как заказчик сказал, так и делаем).
  14. В GetIt есть LockBox VCL and FMX 2.1. Вполне юзабельно. Зашифровать: AES := TLbRijndael.Create(nil); try AES.CipherMode := TLbCipherMode.cmCBC; AES.KeySize := TLbKeySizeRDL.ks256; AES.GenerateKey(Passphrase); FPassword := AES.EncryptString(Value); finally AES.Free; end; Расшифровать: AES := TLbRijndael.Create(nil); try AES.CipherMode := TLbCipherMode.cmCBC; AES.KeySize := TLbKeySizeRDL.ks256; AES.GenerateKey(Passphrase); Result := AES.DecryptString(FPassword); finally AES.Free; end; p.s. Тему перенёс в подходящий раздел
  15. Ответ есть в теме Узнать количество свободного места p.s. Тему перенёс в подходящий раздел
  16. Общие шаги такие: Подписываетесь через BroadcastReceiver на READ_PHONE_STATE (и возможно ещё на что-то) и при звонке проверяете состояние и номер. Если выполнять действия надо скрытно, то пишите сервис p.s. Тему перенёс в подходящий раздел.
  17. Ссылка: http://delphifmandroid.blogspot.ru/2016/11/html.html Автор: Андрей Ефимов Описание:
  18. Ну если это тот же баг, что словил я, то вам однозначно помогут такие действия (рекомендация от Ярослава, по конкретно моему багу): 1) Закрываем студию, так чтобы в диспетчере задач не было процесса "bds.exe" 2) Идём в папку C:\Program Files\Embarcadero\Studio\18.0\bin, находим там файл MultidevicePreview240.bpl 3) Переименовываем его в !MultidevicePreview240.bpl 4) Запускаем студию и проверяем (если не поможет, то переименуйте файл обратно) p.s. Вот мой багрепорт https://quality.embarcadero.com/browse/RSP-15992
  19. Как правильно удалять контролы в RunTime? Automatic Reference Counting in Delphi Mobile Compilers
  20. Судя по интернету, есть такая проблема на некоторых девайсах. Что можно попробовать: 1) Перезапуск устройств и последующая попытка подключения 2) Провести сопряжение устройств и оставить их видимыми, попытаться подключиться Если не получится, тогда лучше сразу сюда https://quality.embarcadero.com/secure/Dashboard.jspa отписаться. (укажите всю информацию, логи, модели устройств, демо проекты)
  21. Не за что. Перед окончательной сборкой, проверь права в манифесте, на всякий случай. Ещё можно сделать Clean проекта и потом уже собирать.
  22. Да, конечно, там даже на фото видно, что включён bluetooth на LG, а все остальные сети отключены (вкл. мобильную). Да, можно конечно. Я вам выложу вообще весь проект, с уже собранными приложениями, т.е. в папках лежат исходники, apk-файлы, exe-файлы. (осторожно весит 145 МБ) залил на свой Google Диск https://drive.google.com/open?id=0BwEZB8sRo0DSc3lodnJWbDR3Nms На каких девайсах пробуете и какие версии Андроида на них? p.s. Собрано на Delphi Berlin Update 1
×
×
  • Создать...