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

Pax Beach

Пользователи
  • Постов

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

  • Посещение

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

    12

Весь контент Pax Beach

  1. Поможете с аргументами?
  2. Pax Beach

    Что выбрать VCL или FMX?

    Прошу участников поделиться мнениями. При создании приложения только для Windows, как мне узнать, что лучше выбрать VCL или FMX? Повлияет ли мой выбор на дальнейшую жизнь приложения? Приложение для работы с локальной БД SQL Server и получения пакетов из интернета.
  3. Допилим, если не будет работать. Спасибо!
  4. Спасибо большое, хороший полезный класс! Можно еще выложить простой пример использования — создание, инициализация, запуск, остановка, уничтожение? Думаю, очень поможет форумчанам.
  5. в PlatformSDK есть helper SQLiteOpenHelper.java, в нем метод getWritableDatabase(). Осталось научиться в сервисе работать с SQLite таким образом. Может есть из вас, кто хорошо разобрался, как импортировать JAVA код в Delphi? /** * Create and/or open a database that will be used for reading and writing. * The first time this is called, the database will be opened and * {@link #onCreate}, {@link #onUpgrade} and/or {@link #onOpen} will be * called. * * <p>Once opened successfully, the database is cached, so you can * call this method every time you need to write to the database. * (Make sure to call {@link #close} when you no longer need the database.) * Errors such as bad permissions or a full disk may cause this method * to fail, but future attempts may succeed if the problem is fixed.</p> * * <p class="caution">Database upgrade may take a long time, you * should not call this method from the application main thread, including * from {@link android.content.ContentProvider#onCreate ContentProvider.onCreate()}. * * @throws SQLiteException if the database cannot be opened for writing * @return a read/write database object valid until {@link #close} is called */ public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null) { if (!mDatabase.isOpen()) { // darn! the user closed the database by calling mDatabase.close() mDatabase = null; } else if (!mDatabase.isReadOnly()) { return mDatabase; // The database is already open for business } } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { db = mContext.openOrCreateDatabase(mName, 0, mFactory, mErrorHandler); } int version = db.getVersion(); if (version != mNewVersion) { db.beginTransaction(); try { if (version == 0) { onCreate(db); } else { if (version > mNewVersion) { onDowngrade(db, version, mNewVersion); } else { onUpgrade(db, version, mNewVersion); } } db.setVersion(mNewVersion); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } onOpen(db); success = true; return db; } finally { mIsInitializing = false; if (success) { if (mDatabase != null) { try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock(); } mDatabase = db; } else { if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } }
  6. Создавать отдельный поток, а в нем уже sleep(msecs)
  7. Rusland, удалось решить эту проблему? Еще есть эта ветка про такое. На Stackoverflow создал вопрос, ждем ответа.
  8. Товарищи, вот у меня такой же вопрос, как в сабже. Сервис работает в процессе приложения, должен собирать геокоординаты устройства и писать их в базу SQLite, которая используется и самим приложением, в том числе приложение работает с собранными координатами. Подскажите пожалуйста, как обеспечить доступ к SQLite из программы и из сервиса, в какую папку базу лучше деплоить и как к ней из приложения и сервиса обращаться? P.S.: Приложение работает с базой SQLite, но на устройстве базу найти не могу, ни в каталоге приложения, ни поиском по всему устройству. В чем фокус, может кто знает? procedure TDM.conSQLiteBeforeConnect(Sender: TObject); var dbPath: string; begin {$IF DEFINED(iOS) or DEFINED(ANDROID)} dbPath := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sdb'); {$ENDIF} {$IF DEFINED(MSWINDOWS)} dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, '..\..\..\DataBase\mybase.sdb')); if not FileExists(dbPath) then dbPath := TPath.GetFullPath(TPath.Combine(TPath.GetLibraryPath, 'mybase.sdb')); {$ENDIF} conSQLite.Database := dbPath; end;
  9. и принтер понял, что это команды переноса строки и перевода каретки?
  10. Сервис занимает в памяти 10-15 Мб, процессор не ест пока стоит. Останавливать его большой нужды для своих задач не вижу, кроме сервисной для сисадминов.
  11. Проект надо посмотреть, выложите сюда. Без окружения непонятно.
  12. Да, этот пример работает. Спасибо. Описанная выше ошибка (не запускается сервис) вылетает, если я с нуля собираю проект. Видимо, как-то классы сервиса присоединять в classes.dex приложения нужно и пересобирать его.
  13. Я пробую пример итальянского коллеги, он работает почему-то. В нем, когда убиваешь в памяти приложение, монитор выбрасывает такой Warning: 05-05 13:14:30.008: W/linker(22430): /data/app/com.embarcadero.LocationSensorDemo-1/lib/arm/libProxyAndroidService.so: is missing DT_SONAME will use basename as a replacement: "libProxyAndroidService.so" Антенна GPS пропадает, лог больше ничего не собирает. Сервис самостоятельно не запускается.
  14. Rusland, второй способ вылетает с ошибкой, пробую первый способ (подключил в сервисе пропатченные модули ...DD, положил компонент TLocationSensor на форму) → при запуске сервиса вылетает ошибка и приложение закрывается. Подскажите, может я чего-то не сделал, например classes.dex надо как-то перестраивать или еще какие-нибудь ухищрения? Код сервиса простой и лог монитора прилагаю. function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin // JavaService.stopSelf; // Log.D('Serice started?'); if not LocationSensor.Active then LocationSensor.Active := true; Result := TJService.JavaClass.START_STICKY; end; procedure TAndroidServiceDM.LocationSensorLocationChanged(Sender: TObject; const OldLocation, NewLocation: TLocationCoord2D); var M: TMarshaller; begin // if Assigned(NewLocation) then // begin Logi(M.AsUtf8('LogLatitude '+ NewLocation.Latitude.ToString).ToPointer); Logi(M.AsUtf8('LogLongitude '+NewLocation.Longitude.ToString).ToPointer); // end; // Log.D(Format('Coords:%8.8f;%8.8f', [NewLocation.Latitude, NewLocation.Longitude])); end;
  15. В названии сервиса нет ошибки? Метод запуска такой префикс класса использует «com.embarcadero.services.». class procedure TLocalServiceConnection.StartService(const AServiceName: string); var LIntent: JIntent; LService: string; begin LIntent := TJIntent.Create; LService := AServiceName; if not LService.StartsWith('com.embarcadero.services.') then LService := 'com.embarcadero.services.' + LService; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString(LService)); TAndroidHelper.Activity.startService(LIntent); end;
  16. Я имею ввиду фразу «Странно что после закрытия программы сервис перестает слать координаты - значок GPS пропадает. Хотя в Настройки->Приложения->Работающие я вижу как процесс перезапускается.». Эту проблему удалось решить?
  17. Пробую Ваше решение на 10 Update 1, но оно не до конца работает, как я понял из темы (отписался в ветке). А 10.1 Trial не полностью рабочий, снес пока Доктор не одумается или не купим лицензию.
  18. Rusland, не нашлось решение этой проблемы?
  19. В манифесте приложения есть строчка типа <service android:exported="false" android:name="com.embarcadero.services.Project1" /> Это и есть имя сервиса. Не могу проверить у себя пока — завис на том, как запустить сервис с TLocationSensor
  20. А зачем его тут обрабатывать? В этот Intent только ClassName передается. Я предлагал выше из приложения посылать в сервис StopService().
  21. В событии сервиса OnStartCommand точно вращается стикер «не перезапускать сервис»?
  22. procedure TForm1.Button2Click(Sender: TObject); var LIntent: JIntent; begin Log.D('Try to stop'); LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.MyService')); TAndroidHelper.Activity.stopService(LIntent); end; Так останавливать сервис из приложения подойдет?
  23. Посмотрел описание класса https://developers.google.com/android/reference/com/google/android/gms/maps/model/Polyline#developer-guide Может getId в вашем случае не JString возвращает? И я Java не очень знаю, но метод все-таки со скобками лучше вызывать, а не как свойство.
  24. На самом деле, вопрос с правильной отрисовкой на Bitmap в Android тоже не удалось решить. Чтобы в приложении Android правильно отображался QR код, пришлось рисовать на канве TImage.Canvas, а не на канве TImage.Bimap.Canvas. Поэтому при сохранении изображения приходится делать screenshot в TBitmap и далее resample в нужно разрешение изображения (через Canvas.DrawBitmap). function TfmMainQRShare.getFinalBitmap(Img: TImage): TBitmap; var b: TBitmap; begin b := Img.MakeScreenshot; result := TBitmap.Create; result.Assign(b); result.SetSize(512,512); if result.Canvas.BeginScene() then try toast('OK'); result.Canvas.Clear(TAlphaColors.White); result.Canvas.Fill.Bitmap.WrapMode := TWrapMode.TileStretch; result.Canvas.DrawBitmap(b, RectF(, , min(b.Width, b.Height), min(b.Width, b.Height)), RectF(, , 512, 512), 1, true); result.Canvas.EndScene; finally result.Canvas.EndScene; end; end; В итоге, при сохранении получаем только часть изображения (видно ниже). Почему оно искажается при ресамплинге, пока не знаю. Если Canvas.DrawBitmap не делать, а сразу result := Img.MakeScreenshot, тогда все ок — но в Bitmap сохраняется вся канва TImage, а не нужная область, что не правильно.
×
×
  • Создать...