-
Постов
851 -
Зарегистрирован
-
Победитель дней
129
Весь контент Andrey Efimov
-
Самостоятельно (не уверен, что сработает): Там вроде есть ещё логин, можно по нему ресетнуть. Запускаете студию, жмёте "Help->About", смотрите логин (вроде он) в "This product is licensed to:" Заходите https://members.embarcadero.com/, кнопка "Reset My Password" и далее... Или звонок, письмо в тех. поддержку.
-
Уважаемые участники, в частности @des80! Призываю вас к соблюдению общепринятых норм общения. Вынесено 1 предупреждение. За дальнейшим нарушением незамедлительно последует наказание на усмотрение Администратора/Модератора.
-
Уважаемые форумчане! Поздравляю Вас с Наступающим Новым Годом и Рождеством! Пусть 2017 год станет новым этапом на Вашем пути и принесет успех, самореализацию и, конечно же, счастье.
-
Так не устраивает? procedure TFormMain.sbSelectFolderClick(Sender: TObject); var PathFolder: string; begin if SelectDirectory('Выбор папки...', '', PathFolder) then ePathFolder.Text := PathFolder; end; SelectDirectory
-
Тема закрыта. (По вопросам связанным со Студией, на форуме уже есть отдельные темы) up. Тему почистил.
-
Для начала, обновите студию как минимум на версию XE8, именно с этой версии появилась поддержка Android 5.*. В идеале, обновить до версии Берлин, с апдейтами. Более подробно, по всем версиям, читайте тут
-
Важно, ещё уточнить, на какой версии Андроида пробуете. Метод введен в API 21, соответственно работать будет на Android 5.0 и выше.
-
Эм... так если условие совпадения номера не выполняется, то и программа ничего не делает. Как говорится: доверяй, но проверяй. Проверил на архиве, что скинул вам, добавил условие срабатывания вибрации по номеру и всё там нормально обрабатывается, ничего не вылетает. Если номер совпадает - то вибрирует. Если нет, то не вибрирует. Так что ищите ошибку в своём коде...
-
Ага, только перепроверьте обёртку, очень часто они неправильно сгенерены...
-
Верно, событие FormSaveState добавлено для сохранения состояния приложения и выполнения операций по остановке выполнения функций. Т.е. в вашем случае, может быть, будет лучше просто остановить выполнение всех функций, а далее, после сворачивания система сама решит когда "прибить" ваше приложение. Application.Terminate уже стабильно работает на Android? (последний раз проверял еще на XE6, там не работало) На данный момент мне известно несколько (рабочих) вариантов закрытия: Close finish (из Android API) killProcess (из Android API) killBackgroundProcesses (из Android API)
-
Со свежей головой. В дополнение к предыдущим замечаниям. Ну понеслась... Что это такое? 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
-
Исходники - это файлы из корневой папки проекта, без подпапок, в которых собирается проект. Т.е. папка 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, если звонок будет просто с другого номера. Пока вроде всё, что бросилось в глаза, но уже ночь и мог что-то не углядеть. Правьте и пробуйте. Ваш архив перезалил, номер потёр. Итог: Плохо копируете код. Мой совет: Если не знаете, что делаете или просто не охото изучить представленные примеры, то лучше обратитесь в раздел Ищу подрядчика. Или можете попробовать помучить ещё форумчан, хотя вам дали примеры с избытком...
-
Так... Значит пишите так: 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');
-
Ну, а что именно подчёркнуто? Если BroadcastReceiverOnReceive то и правильно, метода же нет у вас в классе, впишите свой CheckPhoneCallState или вот гляньте ответ http://stackoverflow.com/questions/33609494/how-to-check-and-hag-up-reject-incoming-outgoing-calls-on-android-in-delphi, там как раз по этому компоненту и очень похоже на ваш код... АП. Кстати, у @Rusland в той теме, тоже метода не хватает...
-
А с чего у вас будет срабатывать метод 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.
-
На форуме есть раздел Android и поиск (например: Синтез речи (text-to-speech) и ещё Читалка текста. Нет звука (speech.tts)) и android.speech.tts
-
Как правильно удалять контролы в RunTime?
- 3 ответа
-
- компоненты
- создать компонент
-
(и ещё 1 )
C тегом:
-
Зачем вам постоянно висящий в памяти сервис, если он нужен только когда поступил звонок от определённого номера? Вы читали то, что я написал в первом сообщении (особенно про BroadcastReceiver)? Сразу говорю, что готовый код на Delphi/С++, с вероятностью 99% - вы не найдёте, только на Java (на стеке например). Раз у вас проблема именно с определением номера, то значит вы уже подписались на событие звонка и уже сделали сервис(?). Тогда давайте ваш код или покажите, какие данные приходят в сервис, а мы уже попробуем вам помочь. p.s. Я бы сделал так, подписался через BroadcastReceiver на событие, как только событие происходит, проверяю номер и далее уже запускаю сервис, что-то делаю в нём, завершаю работу сервиса. ИЛИ событие происходит, запускаю сервис, в нём проверяю номер и т.д. Тут либо экспериментировать, либо найти готовое решение или описание решения на Java и транслировать на Delphi. Пара ссылок: [Android Service] Создание простейшего Сервиса (службы) [BroadcastReceiver] Автозапуск приложения после перезагрузки ОС [Android Service+BroadcastReceiver] Автозапуск службы после рестарта ОС
-
Не знаю, не пробовал. Была задача: хранить на устройстве в зашифрованном виде пароль, а потом при обращении к сайту по https (Post методом) он передавался открыто (тут уж как заказчик сказал, так и делаем).
-
В 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. Тему перенёс в подходящий раздел
-
Ответ есть в теме Узнать количество свободного места p.s. Тему перенёс в подходящий раздел
- 1 ответ
-
- место на диске
- внутренняя память
- (и ещё 2 )